Как мога да заобиколя факта, че размерът на java ByteBuffer не може да се промени

Чета двоични данни от файл на парче в ByteBuffer и след това обработвам данните в ByteBuffer. Харесва ми да използвам ByteBuffer, защото мога да използвам метода order() за правилно четене на Shorts и Integers.

По-късно трябва да запиша нови/модифицирани данни във файла. Идеята беше да се използва отново 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
Хм, добра идея, освен че не можете да посочите ред на байтовете, когато пишете ints, прави само 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