2014-11-10 5 views
1

Я пытаюсь использовать AsynchronousFileChannel для реализации файла копирования. Объекты AsynchronousFileChannel для чтения и записи будут объявлятьJava AsynchronousFileChannel и ByteBuffer

AsynchronousFileChannel asyncRead = AsynchronousFileChannel.open(sourcePath); 
AsynchronousFileChannel asyncWrite = AsynchronousFileChannel.open(targetPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE); 

CompletionHandler для чтения выглядит

CompletionHandler<Integer, ByteBuffer> handlerRead = new CompletionHandler<Integer, ByteBuffer>() { 

     @Override 
     public void completed(Integer arg0, ByteBuffer arg1) { 
      System.out.println("finished read ..."); 

      // question line 
      asyncWrite.write(ByteBuffer.wrap(arg1.array()), 0, null, handlerWrite); 
     } 

     @Override 
     public void failed(Throwable arg0, ByteBuffer arg1) { 
      System.out.println("failed to read ..."); 
     } 
    }; 

Затем я начинаю файл прочитан

asyncRead.read(buffer, 0, buffer, handlerRead); 

вопрос, после чтения завершено, если я напишу файл (см. комментарий «строка вопроса», чтобы увидеть, где он называется)

// no output 
asyncWrite.write(arg1, 0, null, handlerWrite); 

не будет выписано содержание. Я должен обернуть буфер снова

// works fine 
asyncWrite.write(ByteBuffer.wrap(arg1.array()), 0, null, handlerWrite); 

для того, чтобы увидеть содержание выписал

Мой вопрос, что является причиной, я должен использовать ByteBuffer, чтобы обернуть содержимое другого ByteBuffer?

ответ

3

По какой причине я должен использовать ByteBuffer для обертывания содержимого другого ByteBuffer?

У вас нет. Вместо этого вы должны перевернуть оригинал ByteBuffer. Вы получили аналогичный эффект, позвонив wrap(), который устанавливает position только что завернутого ByteBuffer в ноль.

+0

Я пробовал 'asyncWrite.write ((ByteBuffer) arg1.flip(), 0, null, handlerWrite);', он также работает. Спасибо за подсказку, хотя я до сих пор не знаю, что случилось под капотом. –

+1

Итак, посмотрите Javadoc для 'flip()'. Его цель - поставить буфер в записываемое состояние. Обычно они находятся в читаемом состоянии. После этого вы должны «compact()» или «clear()», если вы снова прочитаете это. – EJP

+0

Да, я уже читал документ, но не перевариваю его. Из того, что вы сказали, это похоже на итератор, что я должен что-то сделать, чтобы переместить указатель на голову, если я хочу повторить этот список во второй раз. Правильно ли я понимаю? –

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