我想从文本文件中读取每一行并将它们存储在ArrayList中(每一行都是ArrayList中的一个条目)。
到目前为止,我知道BufferedInputStream会写入缓冲区,并且只有在缓冲区为空时才会执行另一次读取操作,从而最大限度地减少或至少减少操作系统操作量。
我是否正确 - 我有道理吗?
如果上述情况是在任何情况下,任何人都想使用DataInputStream。最后我应该使用哪两个以及为什么 - 或者这无关紧要。
答案 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 IO和readlines()方法(无论多种多样)。
它会照看缓冲/关闭等,并返回一个文本行列表。我很乐意用缓冲等方式滚动我自己的输入流包装,但是十分之九的Commons IO工作正常并且足够/更简洁/更不容易出错等。
答案 6 :(得分:0)
区别是:
DataInputStream 用于二进制数据,而 BufferedReader 用于字符数据。
所有原始数据类型都可以使用 DataInputStream 类中的相应方法来处理,而只能从 BufferedReader 类中读取字符串数据,并且它们需要被解析成各自的原语。
DataInputStream 是过滤流的一部分,而 BufferedReader 不是。
DataInputStream 消耗较少的内存空间,因为它是二进制流,而 BufferedReader 消耗更多的内存空间,因为它是字符流。
在 DataInputStream 中限制了要处理的数据,而在 BufferedReader 中要处理的字符数范围很广。