Java 你能解释一下流的概念吗?

Java 你能解释一下流的概念吗?,java,.net,stream,language-agnostic,iostream,Java,.net,Stream,Language Agnostic,Iostream,我知道流是字节序列的表示。每个流都提供了将字节读写到其给定备份存储的方法。但这条小溪的意义何在?为什么备份存储本身不是我们与之交互的对象 不管出于什么原因,这个概念对我来说并不合适。我读过很多文章,但我想我需要一个类比或其他东西。流的要点是在您和后台存储之间提供一个抽象层。因此,使用流的给定代码块不需要关心备份存储是否是磁盘文件、内存等。它只是一个概念,另一个抽象层次,使您的生活更轻松。它们都有共同的接口,这意味着您可以以类似管道的方式组合它们。例如,编码到base64,然后压缩,然后将其写入磁

我知道流是字节序列的表示。每个流都提供了将字节读写到其给定备份存储的方法。但这条小溪的意义何在?为什么备份存储本身不是我们与之交互的对象


不管出于什么原因,这个概念对我来说并不合适。我读过很多文章,但我想我需要一个类比或其他东西。

流的要点是在您和后台存储之间提供一个抽象层。因此,使用流的给定代码块不需要关心备份存储是否是磁盘文件、内存等。

它只是一个概念,另一个抽象层次,使您的生活更轻松。它们都有共同的接口,这意味着您可以以类似管道的方式组合它们。例如,编码到base64,然后压缩,然后将其写入磁盘,并全部写入一行

关键是,您不必知道什么是后备存储—它是对它的抽象。事实上,甚至可能没有备份存储—您可以从网络中读取数据,而数据根本就不会“存储”

如果您可以编写代码,无论您是在与文件系统、内存、网络还是其他支持流思想的任何东西进行通信,那么您的代码将更加灵活


此外,流通常是链接在一起的——你可以有一个流,它可以压缩放入其中的任何内容,将压缩的形式写入另一个流,或者对数据进行加密,等等。在另一端会有反向链,解密、解压缩或其他任何内容。

流是字节序列的抽象。其思想是,您不需要知道字节来自何处,只需以标准化的方式读取它们即可

例如,如果您通过流处理数据,那么数据是否来自文件、网络连接、字符串、数据库中的blob等对您的代码来说并不重要


与备份存储本身交互本身没有什么错,只是它将您与备份存储实现联系在一起。

将流视为抽象的数据源(字节、字符等)。它们抽象了从具体数据源读取和写入数据的实际机制,无论是网络套接字、磁盘上的文件还是来自web服务器的响应。

流是一种抽象,它为与数据交互提供了一组标准的方法和属性。通过从实际的存储介质中抽象出来,可以编写代码,而不完全依赖于该介质是什么,甚至不依赖于该介质的实现


一个好的类比可能是考虑一个袋子。你不在乎袋子是什么做的,也不在乎当你把东西放进去时它会做什么,只要袋子能起到袋子的作用,你就能把你的东西拿出来。流为存储媒体定义了包的概念为包的不同实例(如垃圾袋、手提包、背包等)定义的内容—交互规则。

这与流无关—它与游泳有关。如果你能游一条小溪,你就游不到你遇到的任何一条小溪。

< P>我认为你需要考虑后备商店本身只是另一种抽象。内存流很容易理解,但文件完全不同,这取决于您使用的文件系统,更不用说您使用的是什么硬盘。事实上,并非所有流都位于备份存储的顶部:网络流几乎就是流

溪流的意义在于我们把注意力限制在重要的事情上。通过标准抽象,我们可以执行常见的操作。例如,即使您今天不想在文件或HTTP响应中搜索URL,也不意味着您明天不想这样做


流最初是在内存比存储空间小的时候构思出来的。仅仅读取一个C文件可能是一个很大的负担。最小化内存占用非常重要。因此,一个只需加载很少内容的抽象非常有用。今天,它在执行网络通信时同样有用,而且在处理文件时很少受到限制。以通用方式透明地添加缓冲之类的功能使其更加有用。

要添加到echo chamber中,流是一种抽象,因此您不必关心底层存储。当考虑有或没有流的情况时,它是最有意义的。< /P> 文件在很大程度上是无趣的,因为流所做的远远超出了我所熟悉的非基于流的方法所做的。让我们从互联网文件开始

如果我想从internet下载文件,我必须打开TCP套接字,建立连接,并接收字节,直到没有更多的字节。我必须管理一个缓冲区,知道预期文件的大小,并编写代码来检测何时断开连接并适当地处理

假设我有某种TcpDataStream对象。我使用适当的连接信息创建它,然后从流中读取字节,直到它说不再有字节为止。流处理缓冲区管理、数据结束条件和连接管理

通过这种方式,流使I/O更容易。当然,您可以编写一个TcpFileDownloader类来完成流所做的事情,但是您有一个特定于TCP的类。大多数流接口只提供Read()和Write()方法,任何更复杂的概念都由内部实现处理。因此,您可以使用相同的基本代码读取或写入内存、磁盘文件、套接字和许多其他数据存储。

之所以选择“流”一词,是因为它(在现实生活中)与我们使用它时想要传达的意思非常相似

让我们暂时忘掉后备商店,从零开始
int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);
Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);
public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());
// Let's say that cheese.txt is a file that contains this content: 
// I like cheese, a lot! My favorite cheese brand is Leerdammer.
$fp = fopen('cheese.txt', 'r');

$str8 = fread($fp, 8); // read first 8 characters from stream. 

fseek($fp, 21); // set position indicator from stream at the 21th position (0 = first position)
$str30 = fread($fp, 30); // read 30 characters from stream

echo $str8; // Output: I like c 
echo $str30; // Output: My favorite cheese brand is L