使用NIO解码器会导致整个文件被读取吗?

时间:2015-11-22 16:25:06

标签: java memory-management file-io nio

我正在考虑使用Java NIO处理文件并使用解码器功能来处理不同的字符集。我担心的是,如果解码器在一开始就尝试读取整个文件,这可能会导致效率或内存问题。例如,给定以下代码(为清楚起见省略了异常处理程序):

Charset charset = Charset.forName( "ISO-8859-15" );
CharsetDecoder decoder = charset.newDecoder();
FileInputStream fis = new FileInputStream( file );
FileChannel fc = fis.getChannel();
int lenFile = (int)fc.size();
MappedByteBuffer bufferFile = fc.map( FileChannel.MapMode.READ_ONLY, 0, lenFile );
CharBuffer cb = decoder.decode( bufferFile ); // <--- possible problem here
// process character buffer
fc.close();

在创建CharBuffer的行中,我担心的是解码器会创建一个缓冲区来包含整个文件,该文件的大小可能是千兆字节,从而导致内存问题。它是否尝试创建文件大小的缓冲区?有没有办法控制缓冲区的大小?

1 个答案:

答案 0 :(得分:0)

它并不真正读取文件,但会将其映射到内存中。这意味着文件的各个部分是按需读取的,如果操作系统意识到它已经被访问了一段时间,则会被丢弃。

然而,它为输出分配了巨大的CharBuffer,因为这基本上是处理结果。

这里我会考虑实现简单的while循环 - 读取字节,调用解码,刷新当前输出并重复直到到达文件末尾。