gpt4 book ai didi

java - MappedByteBuffer 抛出 java.nio.BufferOverflowException

转载 作者:行者123 更新时间:2023-12-01 11:56:20 25 4
gpt4 key购买 nike

我正在学习java nio,我正在使用MappedByteBuffer和ExecutorService来异步复制文件。我的问题是 MappedByteBuffer.put() 方法抛出 java.nio.BufferOverflowException。但在我的调试中,我没有复制到目标文件的上方位置。这是我用来创建文件新副本的代码部分:

for (Future<?> f : futures) {
Message message = (Message) f.get();
try (FileChannel fileChannel = (FileChannel) Files
.newByteChannel(pathWrite, EnumSet.of(
StandardOpenOption.READ,
StandardOpenOption.WRITE,
StandardOpenOption.TRUNCATE_EXISTING))) {
MappedByteBuffer mbb = fileChannel.map(
FileChannel.MapMode.READ_WRITE, message.getCod(),
message.getValue());

if (mbb != null) {
System.out.println("start: " + message.getCod()
+ " - end: " + message.getValue());
ByteBuffer encode = Charset.forName(charEncoding)
.encode(message.getCharBuffer());
mbb.put(encode); // here
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

异常(exception)是:

java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:363)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:342)
at memo.MultiThreadingMappedByteBufferExample.multiThreadedWayWithExecutorService(MultiThreadingMappedByteBufferExample.java:139)

最佳答案

您将文件截断为零长度,根据message.getCod()提供的偏移量和长度值映射它的一些未知部分。和message.getValue() ,它不存在,因为文件长度为零,然后尝试将 charBuffer将消息提供到文件中,该文件的长度仍然为零,位于 message.getCod() 定义的偏移量处。 ,它不存在,所以你得到 BufferOverflowException .

我建议您不要从一开始就截断文件,但尚不清楚为什么这一切应该起作用。我建议您使用RandomAccessFile 。更简单。您不应该在单个应用程序中使用大量内存映射文件,并且仅将其用于这项微小的工作是不合适的。

关于java - MappedByteBuffer 抛出 java.nio.BufferOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28421810/

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