如何在没有Java缓冲的情况下读取文件?

时间:2014-08-17 05:04:13

标签: java memory bitarray

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

由于我假装内存因我正在处理的问题而受到限制,我想确保读取文件的过程根本没有缓冲。

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

  

为了有效地将字节转换为字符,可以从底层流中读取比满足当前读取操作所需的更多字节。

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

1 个答案:

答案 0 :(得分:4)

  

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

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

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

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

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


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