【发布时间】:2016-02-28 12:44:01
【问题描述】:
我有一个程序可能需要处理可能包含多字节编码的大文件。我当前执行此操作的代码存在创建用于保存整个文件的内存结构的问题,如果文件很大,这可能会导致内存不足错误:
Charset charset = Charset.forName( "UTF-8" );
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 );
// process character buffer
fc.close();
问题在于,如果我使用较小的缓冲区分割文件字节内容并将其零碎地提供给解码器,那么缓冲区可能会在多字节序列的中间结束。我该如何应对这个问题?
【问题讨论】:
-
你到底想做什么?你想要一个 CharBuffer 还是一个字符串?
-
CharBuffer(文件包含的数据可能包含字符串内容,但也可能包含非字符串数据)
-
等等,同一个文件中有非文本数据的文本数据?那就是推动事情
-
@fge 在 CSV 文件中很常见。例如,该文件可能有数据库记录,如:“apple”、5,4345、“Palo Alto, CA”、43[CR][LF] 等。文件中的字符串可能是 UTF-8 或其他多字节编码。
-
错误,不,等等;你似乎在这里混合了几个概念。文本文件应该使用一种编码方案并且只有一种。例如,您永远不会看到部分使用 UTF-8 和 UTF-16 的文本文件。在 UTF-8 中单个 code point 转换为 1 到 4 个字节的事实是另一回事!
标签: java string unicode decoding