我正在使用以下代码读取大文件:
InputStreamReader isr = new InputStreamReader(new FileInputStream(FilePath));
BufferedReader br = new BufferedReader(isr);
while ((cur = br.readLine()) != null)
我能够使用上述代码读取大文件,但我想知道这些读取器在内存中的内部工作方式。 inputstreamreader扮演什么角色?逐行读取文件(例如2 GB)时分配了多少内存?
答案 0 :(得分:4)
InputStreamReader是一种根据某些字符集将原始InputStream(字节流)转换为字符流的工具。 FIleInputStream是来自给定文件的字节流(它扩展了InputStream)。例如,您还可以使用InputStreamReader来从套接字读取文本,因为socket.getInputStream()也提供了InputStream。
InputStreamReader是Reader,它是字符流的抽象类。单独使用InputStreamReader效率低下,因为每个“ readLine”实际上都会从文件中读取。当您使用BufferedReader装饰时,它将读取一个字节的块并将其保留在内存中,并用于后续读取。
关于大小:文档未说明默认值:
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
可以指定缓冲区大小,也可以使用默认大小。的 默认值对于大多数用途来说足够大。
您必须检查源文件才能找到该值。
这是OpenJDK中的实现:
private static int defaultCharBufferSize = 8192;
Oracle的开源JDK实现可能有所不同。