Java BufferedReader可以读取字节吗?
很抱歉,如果这个问题很复杂,但我没有得到我想要的答案 Java文档是这样说的 通常,读取器发出的每个读取请求都会导致底层字符或字节流发出相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。比如说, 将缓冲来自指定文件的输入。如果没有缓冲,每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效Java BufferedReader可以读取字节吗?,java,file-handling,Java,File Handling,很抱歉,如果这个问题很复杂,但我没有得到我想要的答案 Java文档是这样说的 通常,读取器发出的每个读取请求都会导致底层字符或字节流发出相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。比如说, 将缓冲来自指定文件的输入。如果没有缓冲,每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效 我的第一个问题是如果buf
这里有两个问题 1。缓冲 想象一下,你住在离最近的水源一英里的地方,每小时喝一杯水。嗯,你不可能一杯一杯地走到水边。每天去一次,带着一桶足够装满24次的水回家 桶是一个缓冲器 想象一下,你的村庄由河流供水。但有时河水会干涸一个月;其他时候,这条河带来的水太多,以致于村庄被洪水淹没。所以你建了一个水坝,水坝后面有一个水库。水库在雨季蓄水,在旱季逐渐排空。这个村庄一年四季都有稳定的水流 水库是一个缓冲区 计算中的数据流与这两种场景类似。例如,您可以在一次操作系统调用中从文件系统获取数千字节的数据,但如果您希望一次处理一个字符,则需要类似于存储库的内容 BufferedReader中包含另一个读卡器(例如文件读卡器),它是河流,还有一个字节数组,它是水库。每次你读到它时,它都会做一些类似的事情:
if there are not enough bytes in the "reservoir" to fulfil this request
top up the "reservoir" by reading from the underlying Reader
endif
return some bytes from the "reservoir".
但是,当您使用BufferedReader时,您不需要知道它是如何工作的,只需要知道它是如何工作的
2。适用于图像
重要的是要了解BufferedReader和FileReader是阅读器的示例。您可能还没有在编程教育中介绍多态性,所以当您介绍多态性时,请记住这一点。这意味着,如果您有使用FileReader
的代码,但只有符合Reader
的部分,那么您可以替换BufferedReader
,它的工作原理也一样
将变量声明为最通用的类是一个好习惯:
Reader reader = new FileReader(file);
。。。因为这将是添加缓冲所需的唯一更改:
Reader reader = new BufferedReader(new FileReader(file));
我绕道而行是因为所有的Reader
s都不太适合图像
Reader
有两种read
方法:
int read(); // returns one character, cast to an int
int read(char[] block); // reads into block, returns how many chars it read
第二种形式不适用于图像,因为它肯定读取字符,而不是整数
第一个表单看起来似乎还可以——毕竟,它读取ints。事实上,如果您只使用文件阅读器,它可能会很好地工作
但是,请考虑围绕文件读取器的BufferedReader将如何工作。第一次调用BufferedReader.read()时,它将调用FileReader.read(buffer)来填充其缓冲区。然后它将把缓冲区的第一个char
转换回int,并返回该值
特别是当您将多字节字符集引入图片时,这可能会导致问题
因此,如果要读取整数,请使用InputStream
而不是Reader
<代码>输入流具有int读取(字节[]bu
Reader reader = new FileReader(file);
Reader reader = new BufferedReader(new FileReader(file));
int read(); // returns one character, cast to an int
int read(char[] block); // reads into block, returns how many chars it read