Java NIO / MappedByteBuffer和map,以块的形式读取文件的一部分

时间:2011-07-11 13:58:17

标签: java nio bytebuffer

我想在循环中读取大文件的一部分。我不得不只读取整个文件,但这不起作用,我得到一个例外,文件太大了。我将代码更改为下面的列表。下面的代码只读入第一个块。我需要改变什么来移动到下一个块。

   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();

1 个答案:

答案 0 :(得分:3)

您遇到的问题是无法以这种方式访问​​字符编码数据。即你需要知道字符之间的界限在哪里。

访问文件和解码它的字符的成本可能比你读它的成本高得多,所以我会使用一个更简单的BufferedReader。

e.g。说你想从第1000个字节读取。你可以这样做,但你不知道第1000个字节是否是多字节字符的一部分。

如果你可以假设所有字符都是字节,整个问题就更简单了,你不需要CharBuffer,你可以直接访问ByteBuffer,这会更快。