0

我正在学习 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();
                }
            }

例外是:

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

1 回答 1

2

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

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

于 2015-02-10T00:33:18.700 回答