我想从文本文件中读取每一行并将它们存储在ArrayList中(每行是ArrayList中的一个条目).
到目前为止,我知道BufferedInputStream会写入缓冲区,并且只有在缓冲区为空时才会执行另一次读取操作,从而最大限度地减少或至少减少操作系统操作的数量.
我是对的 - 我有道理吗?
如果以上情况是在任何情况下,任何人都想使用DataInputStream.最后我应该使用哪两个以及为什么 - 或者无关紧要.
Jon*_*eet 18
使用正常InputStream(如FileInputStream)包裹在一个InputStreamReader再包上一个BufferedReader-然后调用readLine上BufferedReader.
DataInputStream 有利于阅读原语,长度前缀的字符串等.
这两个类并不相互排斥 - 如果您的需求适合,您可以同时使用它们.
当您选择时,BufferedInputStream是关于读取数据块而不是一次读取一个字节.它还提供了readLine()的便捷方法.但是,它还用于在流中进一步查看数据,然后根据需要回滚到流的前一部分(请参阅mark()和reset()方法).
DataInputStream/DataOutputStream提供了读/写某些数据类型的便捷方法.例如,它有一个写/读UTF字符串的方法.如果你自己这样做,你必须决定如何确定字符串的结尾(即使用终结符字节或通过指定字符串的长度).
这与BufferedInputStream的readLine()不同,后者听起来像只返回一行.writeUTF()/ readUTF()处理字符串 - 该字符串可以包含任意数量的行.
BufferedInputStream适用于大多数文本处理目的.如果您正在尝试将类的字段序列化为文件,那么您需要使用DataInput/OutputStream,因为它可以更好地控制二进制级别的数据.
希望有所帮助.
您始终可以同时使用两者:
final InputStream inputStream = ...;
final BufferedInputStream bufferedInputStream =
new BufferedInputStream(inputStream);
final DataInputStream dataInputStream =
new DataInputStream(bufferedInputStream);
Run Code Online (Sandbox Code Playgroud)
小智 5
InputStream:从流(网络或文件)读取字节的基类,提供从流中读取字节并删除流末尾的功能.
DataInputStream:直接读取数据作为基本数据类型.
BufferInputStream:从输入流中读取数据并使用缓冲区来优化访问数据的速度.