gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:40:01 26 4
gpt4 key购买 nike

我想循环读取大文件的部分内容。我必须读取整个文件,但这不起作用,我收到一个异常,即文件太大。我将代码更改为下面的列表。下面的代码仅读取第一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com