java.io
有许多不同的I/O流(FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedStreams 等),我在确定它们之间的差异时感到困惑。有哪些示例表明一种流类型优于另一种流类型,它们之间的真正区别是什么?
7 回答
流:一次一个字节。适用于二进制数据。
读者/作家:一次一个字符。适合文本数据。
任何“缓冲”:一次很多字节/字符。几乎一直都很好。
在学习 Java 时,我对 java.io 做了这样的心理计划:
流
- 面向字节的流(8 位)
- 适用于二进制数据,例如 Java .class 文件
- 适用于“面向机器”的数据
读者/作家
- 面向字符(utf-16)的流(16 位)
- 适用于 Java 源代码等文本
- 适合“以人为本”的数据
缓冲的
- 除非另有证明,否则总是有用的
这是一个很大的话题!我建议您从阅读I/O Streams开始:
I/O 流表示输入源或输出目标。一个流可以表示许多不同类型的源和目标,包括磁盘文件、设备、其他程序和内存阵列。
流支持多种不同类型的数据,包括简单字节、原始数据类型、本地化字符和对象。有些流只是简单地传递数据;其他人以有用的方式操纵和转换数据。
将每个名称分成单词:每个大写字母都是不同的单词。
- 文件输入流是使用Stream从文件中获取输入。
- File Output Stream是使用Stream将Output写入File
等等等等
正如 mmyers 所写:
流:一次一个字节。
读者/作家:一次一个字符。
缓冲*:一次很多字节/字符。
您提到的专业化是用于为各种数据源提供标准接口的特定类型。例如,FileInputStream 和 ObjectInputStream 都将实现 InputStream 接口,但将分别对文件和对象进行操作。
字节流是 Java 1.0 中主要且广泛使用的流类型,用于字符和字节。在 java 1.0 之后,它被弃用了,字符流起着重要作用。即,例如
BufferedReader 会从源中获取字符,它的构造函数看起来像 BufferedReader(Reader inputReader)..
这里 Reader 是一个抽象类,它的一个具体类是 InputStreamReader,它将字节转换为字符并从键盘(System.in)获取输入......
BufferedReader :包含将从流中读取字符的内部缓冲区。内部计数器通过 read() 跟踪要提供给缓冲区的下一个字符。InputStreamReader 将输入作为字节并在内部转换为字符。
Java 输入和输出是根据称为“流”的抽象概念定义的,它是数据序列。有2种流。
- 字节流(8 位字节) Æ 抽象类是:InputStream 和 OutputStream
- 字符流(16 位 UNICODE) Æ 抽象类是:Reader 和 Writer
java.io.* 类使用装饰器设计模式。装饰器设计模式在运行时将责任附加到对象。装饰器比继承更灵活,因为继承在编译时将责任附加到类。java.io.* 类使用装饰器模式基于一些基本类在运行时构造不同的行为组合。
摘自K.Arulkumaran 和 A.Sivayini所著的Java/J2EE 工作面试伴侣一书