我应该使用DataInputStream还是BufferedInputStream

Ank*_*kur 14 java io

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

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

我是对的 - 我有道理吗?

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

Jon*_*eet 18

使用正常InputStream(如FileInputStream)包裹在一个InputStreamReader再包上一个BufferedReader-然后调用readLineBufferedReader.

DataInputStream 有利于阅读原语,长度前缀的字符串等.


Mik*_*ike 7

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

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

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

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

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

希望有所帮助.

  • 您将BufferedInputStream与BufferedReader混淆.InputStreams没有行的概念所以没有readLine() (3认同)

Mik*_*ler 5

您始终可以同时使用两者:

final InputStream inputStream = ...;
final BufferedInputStream bufferedInputStream =
        new BufferedInputStream(inputStream);
final DataInputStream dataInputStream =
        new DataInputStream(bufferedInputStream);
Run Code Online (Sandbox Code Playgroud)

  • `DataInputStream` 不会缓冲输入,`BufferedInputStream` 会(显然)。通过用`BufferedInputStream`包装`InputStream`,然后用`DataInputStream`包装`BufferedInputStream`,你得到一个更容易使用的输入流(`DataInputStream`提供的便利方法很有用)并由缓冲读取器支持,使得I/O 更高效。 (4认同)

小智 5

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

DataInputStream:直接读取数据作为基本数据类型.

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