Я пытаюсь использовать 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?
Я пробовал 'asyncWrite.write ((ByteBuffer) arg1.flip(), 0, null, handlerWrite);', он также работает. Спасибо за подсказку, хотя я до сих пор не знаю, что случилось под капотом. –
Итак, посмотрите Javadoc для 'flip()'. Его цель - поставить буфер в записываемое состояние. Обычно они находятся в читаемом состоянии. После этого вы должны «compact()» или «clear()», если вы снова прочитаете это. – EJP
Да, я уже читал документ, но не перевариваю его. Из того, что вы сказали, это похоже на итератор, что я должен что-то сделать, чтобы переместить указатель на голову, если я хочу повторить этот список во второй раз. Правильно ли я понимаю? –