我正在解决编程珍珠,第2版,第1列中的问题。其中一个问题涉及编写一个只使用大约1兆字节内存的程序,将每个位的文件内容存储为位数组表示文件中是否存在7位数字。由于Java是我最熟悉的语言,我决定使用它,即使作者似乎考虑过C和C ++。
由于我假装内存因我正在处理的问题而受到限制,我想确保读取文件的过程根本没有缓冲。
我认为InputStreamReader
是一个很好的解决方案,直到我在Java documentation中阅读:
为了有效地将字节转换为字符,可以从底层流中读取比满足当前读取操作所需的更多字节。
理想情况下,只从流中读取必要的字节 - 换句话说,我不想要任何缓冲。
答案 0 :(得分:4)
其中一个问题涉及编写一个程序,该程序仅使用大约1兆字节的内存来存储文件内容作为位数组,每个位表示文件中是否存在7位数字。
这意味着您需要将文件读取为字节(而不是字符)。
假设您确实需要在没有缓冲的情况下从文件中读取,那么您应该使用FileInputStream
类。它没有缓冲。它准确读取(或尝试读取)您要求的字节数。
如果您需要将这些字节转换为字符,可以通过将适当的String
构造函数应用于byte
或byte[]
来实现。请注意,对于UTF-8
等多字节字符编码,您需要来读取足够的字节来完成每个字符。在没有预读的可能性的情况下这样做有点棘手......并且需要了解您正在阅读的字符编码的知识*。
(您可以直接使用CharsetDecoder
来避免这些知识。但是,您需要使用对decode
个对象进行操作的Buffer
方法,这是一个有点复杂。)
对于它的价值,Java在字节流和字符流I / O之间进行了 clear 区分。前者由InputStream
和OutputStream
支持,后者由Reader
和Write
支持。 InputStreamReader
类是Reader
,适应 InputStream
。你不应该考虑将它用于想要按字节顺序读取内容的应用程序。