Java NIO/MappedByteBuffer 和映射、分块读取部分文件

标签 java nio bytebuffer

我想循环读取大文件的部分内容。我必须读取整个文件,但这不起作用,我收到一个异常,即文件太大。我将代码更改为下面的列表。下面的代码仅读取第一个 block 。我需要更改什么才能移动到下一个 block 。

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

最佳答案

您遇到的问题是无法通过这种方式访问​​字符编码数据。也就是说,您需要知道字符之间的边界在哪里。

访问文件和字符解码的成本可能比读取文件的方式昂贵得多,因此我会使用 BufferedReader,它也会简单得多。

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

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

关于Java NIO/MappedByteBuffer 和映射、分块读取部分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651227/

相关文章:

java - 在Java中获取图像质量与ImageMagick的 "identify"命令相同

java - 按级别打印任何给定的二进制 TreeSet -Java

java - 套接字上并发读写的线程安全

tomcat - Tomcat的BIO Connector和NIO Connector有什么区别?

java - 在java中释放直接缓冲区以及可能的陷阱

makefile - 从源代码构建 jdk(openjdk-7)

java - 使用Java在ANTLR4中绘制解析树

java - 无法获取两个文件之间的正确相对路径,仅当一个路径是文件而另一个路径是目录时,这是正常的预期行为吗?

java - 如何从 TCP 套接字获取数据到 ByteBuffer

java - 如何正确使用ByteBuffer?