我无法真正理解Java中FileReader和BufferedReader类的用途。
在docs.oracle,建议将缓冲的读取器封装在FileReader对象周围,因为直接使用FileReader并不有效。费用或间接费用从何而来?
假设我有一个文本文件,我想使用以下类读取到我的java程序中:
我使用FileReader和BufferedReader
FileReader fileReader = new FileReader(new File("text.txt)"); // probably correct???
BufferedReader bufferedReader = new BufferedReader(fileReader);1)这里的FileReader对象的任务是什么?它是否负责通过操作系统向文件发出I/O请求,然后读取字节?这个要花多少钱?FileReader发出几个I/O请求是真的吗?还是FileReader对象必须逐字符将字节转换为字符时的成本?
2) BufferedReader的任务-object-指上面的最后一句。-BufferedReader-对象的角色是否简单地缓冲了传入字节的数组,然后将其转换为字符?
非常感谢你的回答
编辑:首先,感谢收到的答案。但我应该提到,这正是我研究过的这些文件。叫我愚蠢什么的--但“每一个阅读请求”是什么意思呢?什么时候每个读取请求?隔多长时间?
通常,每个由读取器发出的读取请求都会导致对底层字符或字节流提出相应的读取请求。因此,建议将BufferedReader封装在任何读取()操作可能代价高昂的读取器(如FileReaders和InputStreamReaders )周围。例如,
这就是为什么启动这个问题的主要原因--听起来FileReader会导致大量I/O请求,从而减缓了速度。
发布于 2014-08-01 14:29:39
来自甲骨文:
通常,由Reader发出的每个读取请求都会导致对底层字符或字节流提出相应的读取请求。因此,建议将BufferedReader封装在任何读取()操作可能代价高昂的读取器(如FileReaders和InputStreamReaders )周围。例如, BufferedReader in =(新FileReader("foo.in"));将缓冲指定文件的输入。在没有缓冲的情况下,每次调用read()或readLine()都会导致字节从文件中读取,转换成字符,然后返回,这是非常低效率的。
因此,正如文档明确指出的那样,将BufferedReader封装在FileReader上可以防止一次又一次地从文件中读取数据。BufferedReader缓冲输入。
发布于 2014-08-01 14:39:46
Java有许多可以组合的I/O类。所以你可能会看到这样的情况:
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(new File("..."), "UTF-8"));
...
in.close(); // Closes all.这允许灵活的组合。因此,XML解析器可以使用Reader,而不关心文本来自何处:文件、URL、内存。这与“更简单”的语言不同,后者没有实现的选择(,TreeMap)。
现在,FileReader和FileWriter是在默认操作系统编码中读取和写入文件的旧实用工具类。所以对于本地文件。非便携 (!)其他操作系统,或者需要固定的编码。
为此,FileReader扩展了InputStreamReader,它使用FileInputStream读取二进制数据( InputStream)。就这么做了。
然而,使用更大的内存缓冲区来读取是有意义的,因此,这也是一个长期存在的建议。请记住,在java的早期,性能是一个问题。FileReader独立的唯一优势是在内存紧张的情况下,也许在智能手机上。
https://stackoverflow.com/questions/25082394
复制相似问题