我应该使用DataInputStream还是BufferedInputStream?(这是一个提问标题)

16

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

到目前为止,我了解到BufferedInputStream会写入缓冲区,并且只有在缓冲区为空时才进行另一次读取操作,从而减少操作系统的操作量。

我的理解正确吗 - 我说得通吗?

如果上述情况属实,那么在什么情况下会使用DataInputStream呢?最后,我应该使用这两者中的哪一个,为什么 - 还是无所谓呢?


你为什么认为它们是可以互换的? - Raedwald
7个回答

23

使用正常的InputStream(如FileInputStream)包装在InputStreamReader中并再次包装在BufferedReader中 - 然后在BufferedReader 上调用readLine

DataInputStream 适用于读取原始数据、长度前缀字符串等。


为什么我不能像使用FileReader一样使用Reader? - acrastt
如果您只需要从“Reader”中获取内容,那么可以这样做 - 但是它没有readLine方法,而这个问题涉及到读取 - Jon Skeet

8
这两个类并不是互斥的 - 如果你的需求适合,你可以同时使用它们。
正如你所了解的,BufferedInputStream 是关于按块读取数据而不是一次读取一个字节。它还提供了方便的 readLine() 方法。然而,它也用于查看流中更远的数据,如果需要,则回滚到流的先前部分(请参阅 mark() 和 reset() 方法)。
DataInputStream/DataOutputStream 提供了方便的方法来读取/写入某些数据类型。例如,它有一个方法来写入/读取 UTF 字符串。如果你要自己做这个,你必须决定如何确定字符串的结束(即通过终止字节还是指定字符串的长度)。
这与 BufferedInputStream 的 readLine() 不同,后者只返回单行。writeUTF()/readUTF() 处理字符串 - 该字符串可以拥有任意多行。
BufferedInputStream 适用于大多数文本处理目的。如果你正在尝试将类的字段序列化到文件中等特殊操作,你应该使用 DataInput/OutputStream,因为它在二进制级别上提供了更大的数据控制。
希望这可以帮助到你。

3
您把BufferedInputStream和BufferedReader混淆了。InputStreams没有行的概念,因此没有readLine()方法。请注意区分它们。 - Martin OConnor

5
您可以始终同时使用两种方法:
final InputStream inputStream = ...;
final BufferedInputStream bufferedInputStream =
        new BufferedInputStream(inputStream);
final DataInputStream dataInputStream =
        new DataInputStream(bufferedInputStream);

你能详细解释一下吗?为什么要这样同时使用它们? - Mohammad Siavashi
4
DataInputStream不会缓存输入,而BufferedInputStream会(显然)。通过将InputStream包装在BufferedInputStream中,然后再将BufferedInputStream包装在DataInputStream中,您可以获得一个更易于处理的输入流(DataInputStream 提供的方便方法很有用),同时由缓冲读取器支持,使I / O更高效。 - Mike Holler

5

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

DataInputStream:用于直接读取原始数据类型的数据。

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


3

在需要以跨平台的方式解释由非Java语言写入的文件中的原始类型时,应使用DataInputStream。


2
我建议使用Jakarta Commons IOreadlines()方法(任何种类的方法都可以)。它会处理缓冲/关闭等问题,并返回一个文本行列表。我很乐意自己编写带有缓冲等的输入流包装器,但十有八九的情况下,Commons IO的东西都可以正常工作,并且足够/更简洁/更少出错等。

0

它们的区别在于:

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

  • 所有基本数据类型都可以使用 DataInputStream 类中相应的方法进行处理,而只有字符串数据可以从 BufferedReader 类中读取,并且需要将其解析为相应的基本数据类型。

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

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

  • DataInputStream 处理的数据量有限,而 BufferedReader 处理的字符数范围更广。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接