gpt4 book ai didi

java - 如何在 Java 中读取没有任何缓冲的文件?

转载 作者:行者123 更新时间:2023-11-29 03:18:00 25 4
gpt4 key购买 nike

我正在解决 Programming Pearls,第 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类(class)。它没有缓冲。它准确读取(或尝试读取)您要求的字节数。

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

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


就其值(value)而言,Java 明确区分了字节流和字符流 I/O。前者由 InputStream 支持和 OutputStream , 后者是 ReaderWrite . InputStreamReader类是 Reader , 适应 InputStream .您不应该考虑将它用于想要按字节读取内容的应用程序。

关于java - 如何在 Java 中读取没有任何缓冲的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com