Задать вопрос
@artemfisher

Как использовать разные буферы для чтения и записи в FileChannel и AsynchronousFileChannel?

Записываю в канал с помощью одного буфера, потом читаю из этого же канала, но уже в другой буфер. Код ниже ничего не выведет. Не могу понять причину. Для AsynchronousFileChannel аналогичный код так же ничего не выведет.

FileChannel channel = FileChannel.open(Path.of("test.txtx"),StandardOpenOption.CREATE, 
				StandardOpenOption.WRITE, StandardOpenOption.READ);
		
ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put("hello world".getBytes());
channel.write(buffer, 0);		
		
ByteBuffer buffer2 = ByteBuffer.allocate(15);
channel.read(buffer2, 0);
		
System.out.println(new String(buffer2.array())); // ничего не выведет
  • Вопрос задан
  • 20 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vamp
@Vamp
Буфер нужно переключать между режимами чтение/запись:

FileChannel channel = FileChannel.open(Path.of("test.txtx"),StandardOpenOption.CREATE, 
				StandardOpenOption.WRITE, StandardOpenOption.READ);
		
ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put("hello world".getBytes()); // записали в буфер данные
buffer.flip(); // <--- переключили буфер из режима записи в режим чтения
channel.write(buffer, 0); // теперь channel.write сможет прочитать записанные в 
                          // буфере данные и записать их в файл
		
ByteBuffer buffer2 = ByteBuffer.allocate(15);
channel.read(buffer2, 0); // channel.read прочитал данные из файла и записал их в буфер
buffer2.flip(); // <--- переключаем из записи в чтение
System.out.println(StandardCharsets.UTF_8.decode(buffer2)); // decode читает данные из буфера
                                                            // и составляет из них строку

// Здесь ничего не выводилось, потому что без flip ничего и не записалось в файл.
System.out.println(new String(buffer2.array())); // ничего не выведет
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы