我想在循环中读取大文件的一部分。我不得不只读取整个文件,但这不起作用,我得到一个例外,文件太大了。我将代码更改为下面的列表。下面的代码只读入第一个块。我需要改变什么来移动到下一个块。
final FileInputStream fis = new FileInputStream(f);
final FileChannel fc = fis.getChannel();
final long sizeRead = fc.size() < defaultReadBufferSize ? fc.size() : defaultReadBufferSize;
final MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sizeRead);
while (bb.hasRemaining()) {
final CharBuffer cb = decoder.decode(bb);
this.search(f, cb);
System.out.println("============>" + cb.length());
System.out.println("============>" + bb.hasRemaining());
}
fc.close();
答案 0 :(得分:3)
您遇到的问题是无法以这种方式访问字符编码数据。即你需要知道字符之间的界限在哪里。
访问文件和解码它的字符的成本可能比你读它的成本高得多,所以我会使用一个更简单的BufferedReader。
e.g。说你想从第1000个字节读取。你可以这样做,但你不知道第1000个字节是否是多字节字符的一部分。
如果你可以假设所有字符都是字节,整个问题就更简单了,你不需要CharBuffer,你可以直接访问ByteBuffer,这会更快。