Java I / O流定义和子类型

时间:2017-07-26 06:08:32

标签: java

我是Java新手,并阅读本网站上的一篇帖子:

  

所有流的行为方式都相同,即使它们链接的实际物理设备不同。因此,相同的I / O类和方法可以应用于任何类型的设备

引自:Stream definition

我无法解决的问题是所有流如何(例如,采用不同的字节流子类型 - BufferedInputStream FilterInputStream ObjectInputStream ,...等)以相同的方式运行,并且可以连接到任何物理设备,当它们被实现为不同的类,据称提供不同的功能并容纳不同的源/目的地?例如,我可以使用 ObjectInputStream FileOutputStream 来读取和写入控制台吗?不同的流,不同的设备和所有(流)可以连接到所有(设备) - 我在这里不知所措..

2 个答案:

答案 0 :(得分:3)

引用并未说明您可以将任何流连接到任何设备,正如您所说的那样。有InputStreamOutputStream的不同实现连接到特定设备 - 例如,FileInputStream连接到文件系统上的文件,ByteArrayInputStream连接到字节数组存储器中。

引用解释的主要思想是所有这些不同类型的流都是类InputStreamOutputStream的扩展,因此您可以使用任何内容对流进行所有常见操作特定种类的流,无论特定类型的流从何处读取或写入数据。

某些流是围绕其他流的包装器,添加了特定的功能。例如,BufferedOutputStream为底层流添加缓冲。这通常很有用,因为对于某些流,以块为单位写入比逐字节写入更有效 - BufferedOutputStream收集写入缓冲区的字节,然后将其作为一个块写入底层流。 ObjectOutputStream是另一个包装器,它添加了将可序列化Java对象转换为可写入底层流的字节的功能。

答案 1 :(得分:1)

您无法为每台设备使用每个Stream。根据你问题的定义(我粗体),

  

所有流表现的方式相同。

因此,您可以使用相同的每个流,这意味着每个Stream具有相同的方法,因为它们从java.io.OutputStreamjava.io.InputStream继承。

因此,您是否要写入控制台或文件或网络套接字并不重要,例如,总是写一个字节数组到设备。

尽管如此,有不同的实现方式可以区别地处理这个字节数组。