【问题标题】:Should I use DataInputStream or BufferedInputStream我应该使用 DataInputStream 还是 BufferedInputStream
【发布时间】:2009-04-10 11:02:16
【问题描述】:

我想从文本文件中读取每一行并将它们存储在一个 ArrayList 中(每一行都是 ArrayList 中的一个条目)。

到目前为止,我了解到 BufferedInputStream 会写入缓冲区,并且只有在缓冲区为空时才会进行另一次读取,这可以最大限度地减少或至少减少操作系统操作的数量。

我说得对吗 - 我说得通吗?

如果是上述情况,在什么情况下会有人想使用 DataInputStream。最后,我应该使用这两者中的哪一个以及为什么 - 或者这无关紧要。

【问题讨论】:

  • 是什么让您认为它们可以互换?

标签: java io


【解决方案1】:

使用普通的InputStream(例如FileInputStream)包裹在InputStreamReader中,然后包裹在BufferedReader中 - 然后在BufferedReader上调用readLine

DataInputStream 适合读取原语、长度前缀字符串等。

【讨论】:

    【解决方案2】:

    这两个类并不相互排斥 - 如果需要,您可以同时使用它们。

    正如您所了解的,BufferedInputStream 是关于读取数据块而不是一次读取一个字节。它还提供了方便的 readLine() 方法。但是,它也用于在流中进一步查看数据,然后在需要时回滚到流的前一部分(请参阅 mark() 和 reset() 方法)。

    DataInputStream/DataOutputStream 为读取/写入某些数据类型提供了便利的方法。例如,它有一个写入/读取 UTF 字符串的方法。如果您要自己执行此操作,则必须决定如何确定字符串的结尾(即使用终止符字节或指定字符串的长度)。

    这与 BufferedInputStream 的 readLine() 不同,就像方法听起来一样,它只返回一行。 writeUTF()/readUTF() 处理字符串 - 该字符串可以有任意多行。

    BufferedInputStream 适用于大多数文本处理目的。如果您正在做一些特别的事情,例如尝试将类的字段序列化为文件,您会希望使用 DataInput/OutputStream,因为它可以更好地控制二进制级别的数据。

    希望对您有所帮助。

    【讨论】:

    • 您将 BufferedInputStream 与 BufferedReader 混淆了。 InputStreams 没有行的概念,所以没有 readLine()
    【解决方案3】:

    你总是可以同时使用:

    final InputStream inputStream = ...;
    final BufferedInputStream bufferedInputStream =
            new BufferedInputStream(inputStream);
    final DataInputStream dataInputStream =
            new DataInputStream(bufferedInputStream);
    

    【讨论】:

    • 你能详细解释一下吗?为什么要这样使用它们?
    • DataInputStream 不会缓冲输入,BufferedInputStream 会(显然)。通过将InputStream 包装为BufferedInputStream,然后将BufferedInputStream 包装为DataInputStream,您将获得一个更易于使用的输入流(DataInputStream 提供的便捷方法很有用)并由缓冲读取器支持,从而使I/O 效率更高。
    【解决方案4】:

    InputStream:从流(网络或文件)中读取字节的基类,提供从流中读取字节并删除流结尾的能力。

    DataInputStream:直接将数据作为原始数据类型读取。

    BufferInputStream:从输入流中读取数据并使用缓冲区优化访问数据的速度。

    【讨论】:

      【解决方案5】:

      当您需要以独立于平台的方式解释由其他 Java 语言编写的文件中的原始类型时,您应该使用 DataInputStream。

      【讨论】:

        【解决方案6】:

        我会提倡使用Jakarta Commons IOreadlines() 方法(任何种类)。

        它会处理缓冲/关闭等,并给你一个文本行列表。我会很高兴地使用缓冲等滚动我自己的输入流包装,但是十分之九的 Commons IO 工作正常并且足够/更简洁/不易出错等。

        【讨论】:

          【解决方案7】:

          区别在于:

          • DataInputStream 处理二进制数据,而 BufferedReader 处理字符数据。

          • 所有原始数据类型都可以通过DataInputStream类中的相应方法处理,而BufferedReader类只能读取字符串数据,需要解析成各自的原语。

          • DataInputStream 是过滤流的一部分,而 BufferedReader 不是。

          • DataInputStream是二进制流,占用的内存空间少,而BufferedReader是字符流,占用的内存空间多。

          • DataInputStream中要处理的数据是有限的,而BufferedReader中要处理的字符数范围很广。

          【讨论】:

            猜你喜欢
            • 2012-06-18
            • 1970-01-01
            • 2018-09-05
            • 1970-01-01
            • 2014-10-25
            • 2015-10-16
            • 2023-03-06
            • 2013-02-20
            • 2011-07-31
            相关资源
            最近更新 更多