Я изучаю java nio, и я использую MappedByteBuffer и ExecutorService для асинхронного копирования файлов. Моя проблема заключается в методе MappedByteBuffer.put(), который бросает java.nio.BufferOverflowException. Но в моем отладке я не копируюсь в позицию моего целевого файла. Это часть кода, который я использую, чтобы создать новую копию файла:MappedByteBuffer бросает 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)
Поскольку я изучаю java nio, я хочу использовать его способы улучшить производительность большой программы, использующей задания параллелизма и асинхронности. Это всего лишь первая попытка помочь мне в большой попытке. Если у вас есть пример с MappedByteBuffer, это мне очень поможет. Спасибо, в любом случае. –
Это не улучшит производительность. Это ухудшит ситуацию. [Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map (java.nio.channels.FileChannel.MapMode,% 20long,% 20long)) так говорит: «Для большинства операционных систем сопоставление файла в памяти дороже, чем чтение или запись нескольких десятков килобайт данных с помощью обычных методов чтения и записи. С точки зрения производительности обычно стоит сопоставлять относительно большие файлы в память ". Если вы просто изучаете Java, вы, безусловно, сначала должны сделать что-то легкое. – EJP