2015-02-10 2 views
0

Я изучаю 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) 

ответ

1

Вы усечения файл до нулевой длины, отображение некоторых неизвестную его часть в соответствии со значениями смещения и длины, предоставленными message.getCod() и message.getValue(), которых нет, потому что файл имеет нулевую длину, а затем пытается поместить в файл charBuffer с сообщением, которое по-прежнему равно нулю, при смещении, определяемом message.getCod(), которого нет, поэтому вы получаете BufferOverflowException.

Я предлагаю вам не обрезать файл для начала, но неясно, почему это должно сработать. Я предлагаю вам использовать RandomAccessFile. Simpler. Вы не должны использовать много файлов с отображением памяти в одном приложении, и использование его только для этой крошечной работы является неуместным.

+0

Поскольку я изучаю java nio, я хочу использовать его способы улучшить производительность большой программы, использующей задания параллелизма и асинхронности. Это всего лишь первая попытка помочь мне в большой попытке. Если у вас есть пример с MappedByteBuffer, это мне очень поможет. Спасибо, в любом случае. –

+1

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

Смежные вопросы