【问题标题】:How do I read a file without any buffering in Java?如何在 Java 中读取没有任何缓冲的文件?
【发布时间】:2014-10-10 08:54:53
【问题描述】:

我正在解决 Programming Pearls,第 2 版,第 1 列中的问题。其中一个问题涉及编写一个程序,该程序仅使用大约 1 兆字节的内存来将文件的内容存储为每个位的位数组表示文件中是否存在 7 位数字。由于 Java 是我最熟悉的语言,因此我决定使用它,尽管作者似乎已经考虑过 C 和 C++。

由于我为了解决我正在处理的问题而假装内存是有限的,所以我想确保读取文件的过程完全没有缓冲。

我认为InputStreamReader 会是一个很好的解决方案,直到我在Java documentation 中读到这个:

为了实现字节到字符的高效转换,可能会从底层流中提前读取比满足当前读取操作所需的更多的字节。

理想情况下,只会从流中读取必要的字节——换句话说,我不想要任何缓冲。

【问题讨论】:

  • 我真的不明白这个问题的动机。如果您的主要数据结构是 1MB,那么几千字节的输入缓冲区不会杀死您。

标签: java memory bitarray


【解决方案1】:

其中一个问题涉及编写一个程序,该程序仅使用大约 1 兆字节的内存来将文件的内容存储为位数组,每个位表示文件中是否存在 7 位数字。

这意味着您需要将文件读取为字节(而不是字符)。

假设您确实需要在不缓冲的情况下从文件中读取,那么您应该使用FileInputStream 类。它没有缓冲。它会准确读取(或尝试读取)您要求的字节数。

如果您随后需要将这些字节转换为字符,您可以通过将适当的String 构造函数应用于bytebyte[] 来实现。请注意,对于UTF-8 等多字节字符编码,您将需要读取足够的字节来完成每个字符。在没有预读可能性的情况下这样做有点棘手......并且需要“您正在阅读的字符编码的知识*。

(您可以通过直接使用CharsetDecoder 来避免这些知识。但是您需要使用对Buffer 对象进行操作的decode 方法,这也有点复杂。)


对于它的价值,Java 对字节流和字符流 I/O 做了清晰的区分。前者由InputStreamOutputStream 支持,后者由ReaderWrite 支持。 InputStreamReader 类是 Reader适应 InputStream。您不应该考虑将它用于想要按字节读取内容的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2017-12-06
    • 2019-07-04
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多