【问题标题】:Java I/O streams; what are the differences?Java I/O 流;有什么区别?
【发布时间】:2010-11-12 16:51:03
【问题描述】:

java.io 有许多不同的I/O 流(FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedStreams 等),我在确定它们之间的差异时感到困惑。有哪些流类型优先于另一种流类型的示例,它们之间的真正区别是什么?

【问题讨论】:

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

标签: java io stream java-io


【解决方案1】:

流:一次一个字节。适用于二进制数据。

读者/作家:一次一个字符。适合文本数据。

任何“缓冲”: 多个字节/字符一次。几乎一直都很好。

【讨论】:

  • 我不同意“几乎一直”使用缓冲流是好的。事实上,根据我的经验,这通常是无用的开销。
  • 真的吗?我最近一次检查时,切换到普通 FileReader 时性能下降了大约 40%。你在读什么?
【解决方案2】:

在学习 Java 时,我对 java.io 做了这样的心理计划:

  • 面向字节的流(8 位)
  • 适用于 Java .class 文件等二进制数据
  • 适用于“面向机器”的数据

读取器/写入器

  • 面向字符 (utf-16) 的流(16 位)
  • 适用于 Java 源代码等文本
  • 适合“以人为本”的数据

缓冲

  • 除非另有证明,否则总是有用的

【讨论】:

    【解决方案3】:

    这是一个很大的话题!我建议您先阅读I/O Streams

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

    流支持多种不同的类型 数据,包括简单字节, 原始数据类型,本地化 人物和对象。一些流 简单地传递数据;别人操纵 并以有用的方式转换数据。

    【讨论】:

      【解决方案4】:

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

      • File Input Stream是使用StreamFile获取Input
      • 文件输出流就是使用输出写入文件

      以此类推

      正如mmyers 所写:

      流:一次一个字节。

      Readers/Writers:一次一个字符。

      缓冲*:一次很多字节/字符。

      【讨论】:

        【解决方案5】:

        您提到的专业化是用于为各种数据源提供标准接口的特定类型。例如,FileInputStream 和 ObjectInputStream 都会实现 InputStream 接口,但会分别对 Files 和 Objects 进行操作。

        【讨论】:

          【解决方案6】:

          字节流是 java 1.0 中主要和广泛使用的流类型,用于字符和字节。在 java 1.0 之后,它被弃用了,字符流起着重要作用。即,例如

          BufferedReader 将从源中获取字符,它的构造函数看起来像 BufferedReader(Reader inputReader)..

          这里的Reader是一个抽象类,它的一个具体类是InputStreamReader,它将字节转换为字符并从键盘(System.in)中获取输入......

          BufferedReader :包含将从流中读取字符的内部缓冲区。内部计数器通过 read() 跟踪要提供给缓冲区的下一个字符。 InputStreamReader 将输入作为字节并在内部转换为字符。

          【讨论】:

            【解决方案7】:

            Java 输入和输出是根据称为“流”的抽象概念定义的,它是数据序列。 有 2 种流。

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

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

            来自K.Arulkumaran 和 A.Sivayini 撰写的《Java/J2EE 工作面试指南》一书

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-21
              • 2021-08-25
              相关资源
              最近更新 更多