Как я могу обойти тот факт, что размер java ByteBuffer не может измениться

Я читаю двоичные данные из файла фрагментом в ByteBuffer, а затем обрабатываю данные в ByteBuffer. Мне нравится использовать ByteBuffer, потому что я могу использовать метод order() для правильного считывания коротких и целых чисел.

Позже мне придется записать в файл новые/измененные данные. Идея заключалась в том, чтобы снова использовать ByteBuffer и использовать его методы put. Однако я не знаю, как легко узнать требуемый размер заранее, я мог бы его вычислить, но это означало бы двойной анализ данных. В качестве альтернативы я мог бы использовать ByteArrayOutputStream, но тогда мне нужно написать методы для записи целых чисел BigEndian/LittleEndian ectera.

Что посоветуете, есть ли третий вариант?


person Paul Taylor    schedule 22.09.2015    source источник
comment
Оберните DataOutputStream вокруг ByteArrayOutputStream.   -  person Louis Wasserman    schedule 22.09.2015
comment
Хм, хорошая идея, за исключением того, что вы не можете указать порядок байтов при записи целых чисел, только BigEndian   -  person Paul Taylor    schedule 23.09.2015
comment
Вы можете использовать Integer.reverseBytes, чтобы справиться с этим.   -  person Louis Wasserman    schedule 23.09.2015


Ответы (2)


Я могу думать о двух (других) подходах:

  • Если проблема в том, что вы не можете заранее предсказать размер файла, не делайте этого. Вместо этого используйте File.length() или Files.size(Path), чтобы найти размер файла.

  • Если вы можете обрабатывать файл фрагментами, то прочитайте фрагмент, обработайте его и запишите в новый файл. В зависимости от вашей обработки вы даже сможете обновить ByteBuffer на месте. Если нет, то (предположительно) размер выходного фрагмента пропорционален размеру входного фрагмента.


Что я рекомендую?

Я не готов что-либо рекомендовать без более подробной информации о проблеме, которую вы пытаетесь решить; то есть характер обработки.

person Stephen C    schedule 22.09.2015
comment
Я записываю данные в существующий файл (на самом деле метаданные аудио), проблема в том, что я не знаю, сколько места потребуется каждому фрагменту метаданных при записи, пока я не прочитаю его и не рассчитаю его размер. - person Paul Taylor; 22.09.2015

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

person vlp    schedule 25.09.2015