我知道流是字节序列的表示.每个流提供读取字节和将字节写入其给定后备存储器的手段.但是这条小溪有什么意义呢?为什么后备store 本身不是我们与之互动的对象呢?

不管出于什么原因,这个概念并不适合我.我读过很多文章,但我想我需要一个类比之类的东西.

推荐答案

之所以 Select "流"这个词,是因为它(在现实生活中)代表的意思与我们使用它时想要传达的意思非常相似.

让我们暂时忘掉后备store ,开始考虑把它比作水流.你会收到源源不断的数据,就像水在河里源源不断地流动一样.你不一定知道数据来自哪里,而且通常你也不需要知道;无论是来自文件、套接字还是任何其他来源,它都不(应该)真正重要.这非常类似于接受一股水流,你不需要知道它来自哪里;无论是来自湖泊、喷泉还是任何其他来源,这都不重要.

也就是说,一旦您开始认为您只关心获取所需的数据,而不管数据来自何处,其他人谈论的抽象就会变得更加清晰.您开始认为可以包装流,并且您的方法仍然可以完美地工作.例如,您可以执行以下操作:

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());

看见?只要您的方法不关心输入源是什么,您就可以通过各种方式自定义源.抽象允许您以一种非常优雅的方式将输入与处理逻辑解耦.

请注意,我们自己创建的流没有备份存储,但它仍然完美地满足了我们的目的.

因此,总而言之,流只是一个输入源,隐藏(抽象)另一个源.只要不 destruct 抽象,代码就会非常灵活.

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

虚拟线程似乎在外部服务调用时阻止运营商线程

当切换javaFX场景时,stage的大小正在Minimize

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

使用java访问具体子类特定方法的最佳方法是什么?

JUnit—如何模拟局部变量对象方法调用

使用标记时,场景大纲不在多个线程上运行

如何以干净的方式访问深度嵌套的对象S属性?

JavaFX Maven Assembly插件一直打包到错误的JDK版本

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

解释左移在Java中的工作原理

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

将响应转换为带值的键

Java中将文本拆分为数字或十进制数字和字符串

带有Health Check的Spring Boot BuildPack打破了本机映像构建过程

Java泛型类方法的静态返回类型是否被类型擦除?

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了