我应该使用DataInputStream还是BufferedInputStream

时间:2009-04-10 11:02:16

标签: java io

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

到目前为止,我知道BufferedInputStream会写入缓冲区,并且只有在缓冲区为空时才会执行另一次读取操作,从而最大限度地减少或至少减少操作系统操作量。

我是否正确 - 我有道理吗?

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

7 个答案:

答案 0 :(得分:18)

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

BufferedReader适用于读取基元,长度前缀的字符串等。

答案 1 :(得分:7)

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

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

DataInputStream / DataOutputStream提供了读/写某些数据类型的便捷方法。例如,它有一个写/读UTF字符串的方法。如果您自己这样做,则必须决定如何确定字符串的结尾(即使用终止符字节或指定字符串的长度)。

这与BufferedInputStream的readLine()不同,后者听起来像只返回一行。 writeUTF()/ readUTF()处理字符串 - 该字符串可以包含任意数量的行。

BufferedInputStream适用于大多数文本处理目的。如果您正在尝试将类的字段序列化为文件,那么您需要使用DataInput / OutputStream,因为它可以更好地控制二进制级别的数据。

希望有所帮助。

答案 2 :(得分:5)

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

DataInputStream:直接以原始数据类型读取数据。

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

答案 3 :(得分:4)

您可以随时使用两者:

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

答案 4 :(得分:3)

如果需要以与平台无关的方式解释由其他Java语言编写的文件中的基元类型,则应使用DataInputStream。

答案 5 :(得分:2)

我主张使用Jakarta Commons IOreadlines()方法(无论多种多样)。

它会照看缓冲/关闭等,并返回一个文本行列表。我很乐意用缓冲等方式滚动我自己的输入流包装,但是十分之九的Commons IO工作正常并且足够/更简洁/更不容易出错等。

答案 6 :(得分:0)

区别是:

  • DataInputStream 用于二进制数据,而 BufferedReader 用于字符数据。

  • 所有原始数据类型都可以使用 DataInputStream 类中的相应方法来处理,而只能从 BufferedReader 类中读取字符串数据,并且它们需要被解析成各自的原语。

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

  • DataInputStream 消耗较少的内存空间,因为它是二进制流,而 BufferedReader 消耗更多的内存空间,因为它是字符流。

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