编程语言
首页 > 编程语言> > 如何在没有Java缓冲的情况下读取文件?

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

作者:互联网

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

由于我假装内存是有限的,我正在处理的问题,我想确保读取文件的过程根本没有缓冲.

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

To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.

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

解决方法:

One of the problems involves writing a program that uses only around 1 megabyte of memory to store the contents of a file as a bit array with each bit representing whether or not a 7 digit number is present in the file.

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

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

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

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

对于它的价值,Java明确区分了字节流和字符流I / O.前者由InputStream和OutputStream支持,后者由Reader和Write支持. InputStreamReader类是一个Reader,它适应InputStream.您不应该考虑将它用于想要按字节方式读取内容的应用程序.

标签:bitarray,java,memory
来源: https://codeday.me/bug/20191007/1867211.html