Java I/O流;它们之间有什么不同?

24

java.io有很多不同的I/O流(例如FileInputStream,FileOutputStream,FileReader,FileWriter,BufferedStreams等),我很困惑如何确定它们之间的区别。有哪些示例可以说明一种流类型比另一种更好,并且它们之间的真正区别是什么?


1
这可能是Java IO API中各种流、Reader和Writer最全面的概述:http://tutorials.jenkov.com/java-io/overview.html。它是更大的Java IO教程的一部分,涵盖了基于字节和字符的流。它还涵盖了用于读写原始数值数据(如int、float等)的流。它还涵盖了用于解析的流,例如PushbackInputStream和PushbackReader。 - Jakob Jenkov
7个回答

42

流(Streams):一个字节一个字节处理,适用于二进制数据。

阅读器/写入器(Readers/Writers):一个字符一个字符处理,适用于文本数据。

任何“缓冲的”(Anything "Buffered"):一次处理多个字节/字符,几乎总是更好的选择。


我不同意使用缓冲流在“几乎所有情况下”都是好的说法。事实上,在我的经验中,它往往是无用的开销。 - Michael Borgwardt
9
真的吗?最近我检查过,使用普通的FileReader时性能下降了约40%。你从什么地方读取数据? - Michael Myers

28

学习Java时,我制定了一个关于java.io的心理方案:

  • 字节定向流(8位)
  • 适用于二进制数据,例如Java .class文件
  • 适用于“机器导向型”数据

读取器/写入器

  • 字符(utf-16)定向流(16位)
  • 适用于文本,例如Java源代码
  • 适用于“人类导向型”数据

缓冲

  • 除非证明无用,否则始终有用

13

这是一个大课题!我建议您首先阅读I/O Streams:

I/O流表示输入源或输出目的地。流可以表示许多不同类型的源和目的地,包括磁盘文件、设备、其他程序和内存数组。

流支持许多不同类型的数据,包括简单字节、原始数据类型、本地化字符和对象。一些流仅传递数据;其他流以有用的方式操作和转换数据。


8

将每个名称分成单词:每个大写字母是一个不同的单词。

  • 文件输入流用于使用文件获取输入
  • 文件输出流用于使用文件写入输出

等等,依此类推。

正如mmyers所写:

流:逐字节处理。

读取器/写入器:逐字符处理。

缓冲区*:一次处理多个字节/字符。


3
您提到的特殊化是指用于为各种数据源提供标准接口的特定类型。例如,FileInputStream和ObjectInputStream都将实现InputStream接口,但分别在文件和对象上操作。

3

Java的输入和输出是通过抽象概念“流”来定义的,它是一系列数据。

有两种类型的流:

  • 字节流(8位字节) Æ 抽象类是:InputStream和OutputStream
  • 字符流(16位UNICODE)Æ 抽象类是:Reader和Writer

java.io.*类使用装饰器设计模式。装饰器设计模式在运行时将职责附加到对象上。装饰器比继承更灵活,因为继承会在编译时将职责附加到类上。java.io.*类使用装饰器模式根据一些基本类在运行时构建不同的行为组合。

enter image description hereenter image description here

来自书籍:Java / J2EE面试指南,作者K.Arulkumaran和A.Sivayini


2
字节流是Java 1.0中最常用的流类型,可用于字符和字节。但在Java 1.0之后,它被弃用了,字符流变得更加重要。例如,BufferedReader将从源获取字符,其构造函数如下:BufferedReader(Reader inputReader)。这里的Reader是一个抽象类,它的具体类之一是InputStreamReader,它将字节转换为字符,并从键盘(System.in)输入。BufferedReader包含内部缓冲区,可以从流中读取字符。内部计数器通过read()方法跟踪下一个要提供给缓冲区的字符。InputStreamReader将输入作为字节并在内部转换为字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接