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

Java 使用NIO解码器会导致读取整个文件吗?,java,memory-management,file-io,nio,Java,Memory Management,File Io,Nio,我正在考虑使用JavaNIO来处理文件,并使用解码器功能来处理不同的字符集。我担心的是,如果解码器试图在一开始读取整个文件,这可能会导致效率或内存问题。例如,给定以下代码(为清楚起见,省略异常处理程序): Charset Charset=Charset.forName(“ISO-8859-15”); CharsetDecoder=charset.newDecoder(); FileInputStream fis=新的FileInputStream(文件); FileChannel fc=fis.

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

Charset Charset=Charset.forName(“ISO-8859-15”);
CharsetDecoder=charset.newDecoder();
FileInputStream fis=新的FileInputStream(文件);
FileChannel fc=fis.getChannel();
int lenFile=(int)fc.size();
MappedByteBuffer bufferFile=fc.map(FileChannel.MapMode.READ_ONLY,0,lenFile);

CharBuffer cb=解码器.解码(缓冲文件);// 它不会真正读取文件,但会将其映射到内存中。这意味着文件的某些部分会按需读取,如果操作系统意识到它已经有一段时间没有被访问,则会将其丢弃

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


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

您已经映射了整个文件并解码了整个映射的缓冲区,当然,您将得到另一个文件大小的缓冲区。但是,如果文件是千兆字节,那么首先就不应该映射它。那么,在不必担心内存问题的情况下解码潜在的大文件的正确方法是什么呢?这似乎是有道理的。但是,如果在解码之前将字符读入缓冲区,如何防止缓冲区端意外拆分多字节字符?此外,Unicode或UTF-8字符串是否需要在第一次读取缓冲区时具有某种前导码,但后续的前导码都不存在问题?
CharsetDecoder
s在读取部分输入时保持其状态。检查,特别是
endOfInput
参数。
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();