0

我想循环读取大文件的一部分。我不得不阅读整个文件,但这没有用,我收到文件太大的异常。我将代码更改为下面的清单。下面的代码只读取第一个块。我需要更改什么才能移动到下一个块。

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

1 回答 1

3

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

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

例如说你想从第 1000 个字节开始读取。您可以这样做,但您不知道第 1000 个字节是否是多字节字符的一部分。

如果您可以假设所有字符都是字节,那么整个问题就简单多了,而且您不需要 CharBuffer,您可以直接访问 ByteBuffer,这样会快得多。

于 2011-07-11T14:15:28.463 回答