有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java NIO/MappedByteBuffer和map,分块读取部分文件

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

   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) 个答案

  1. # 1 楼答案

    问题是,字符编码的数据不能通过这种方式访问。i、 e.你需要知道角色之间的界限在哪里

    访问文件和对其进行字符解码的成本可能比读取文件的成本要高得多,因此我会使用一个更简单的BufferedReader

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

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