我正在解决《Programming Pearls》第 2 版第 1 栏中的问题。其中一个问题涉及编写一个程序,该程序仅使用大约 1 MB 的内存来将文件的内容存储为位数组,其中每个位代表是否或文件中不存在 7 位数字。由于 Java 是我最熟悉的语言,因此尽管作者似乎考虑的是 C 和 C++,但我还是决定使用它。
由于我假装内存对于我正在处理的问题来说是有限的,所以我想确保读取文件的过程根本没有缓冲。
我想InputStreamReader
将是一个很好的解决方案,直到我在Java 文档:
为了实现字节到字符的高效转换,可以从底层流中提前读取比满足当前读取操作所需的更多字节。
理想情况下,只有必要的字节才会从流中读取——换句话说,我不需要任何缓冲。
其中一个问题涉及编写一个程序,该程序仅使用大约 1 MB 的内存来将文件的内容存储为位数组,每个位代表文件中是否存在 7 位数字。
这意味着您需要以字节(而不是字符)的形式读取文件。
假设您确实需要在不缓冲的情况下读取文件,那么您应该使用FileInputStream
班级。它不进行缓冲。它精确地读取(或尝试读取)您要求的字节数。
如果您需要将这些字节转换为字符,您可以通过应用适当的方法来完成此操作String
构造函数到byte
or byte[]
。请注意,对于多字节字符编码,例如UTF-8
, 你会need读取足够的字节来完成每个字符。在无法预读的情况下执行此操作有点棘手……并且需要“了解*您正在阅读的字符编码”。
(您可以通过使用CharsetDecoder
直接地。但是你需要使用decode
操作于的方法Buffer
对象,这也有点复杂。)
就其价值而言,Java 创造了clear字节流 I/O 和字符流 I/O 之间的区别。前者的支持是InputStream
and OutputStream
,后者由Reader
and Write
. The InputStreamReader
类是一个Reader
, that adapts an InputStream
。您不应该考虑将它用于想要按字节读取内容的应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)