Как я могу использовать ReadableByteChannel, чтобы получить содержимое файла и сохранить его в byteBuffer? - PullRequest
2 голосов
/ 20 февраля 2012

Ниже приведен код, который я написал. Я хочу сделать простую вещь, сохраняя данные двоичного файла в byteBuffer.

File file = new File(fileName);
try {
    ReadableByteChannel channel = new FileInputStream(fileName).getChannel();
    ByteBuffer buf = ByteBuffer.allocateDirect(file.length());

    // How can use buf.read to get all the contents?

} catch (Exception e){

}

Мне было интересно

  1. как я могу использовать read, чтобы получить все данные из канала и сохранить их в ByteBuffer
  2. если есть более элегантный способ выделить ByteBuffer, кроме использования File объекта для получения длины файла

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Я предпочитаю использовать сопоставление памяти.

FileChannel channel = new FileInputStream(fileName).getChannel();
ByteBuffer buf = channel.map(MapMode.READ_ONLY,0,channel.size());

Если размер файла превышает 2 ГБ, необходимо иметь более одного сопоставления.С положительной стороны это занимает около 10 мс независимо от размера и не использует много кучи или прямой памяти независимо от размера файла.

4 голосов
/ 20 февраля 2012

Из читабельного канала Javadocs

чтение (ByteBuffer dst)

Предпринята попытка прочитать до r байтов из канала, где r - это количество байтов, оставшихся в буфере, то есть dst.remaining (), на момент вызова этого метода.

Итак ... channel.read(buf);

Что касается вашего второго вопроса, если вы хотите сразу прочитать все содержимое файла в память, это кажется разумным подходом.

...