Как сохранить Java FloatBuffer (или любой буфер) в файл - PullRequest
2 голосов
/ 09 апреля 2009

У меня есть FloatBuffer известного размера, и я просто хочу записать данные в файл (в двоичном виде) для проверки вне моего приложения. Какой самый простой способ сделать это?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2009

ОБНОВЛЕНИЕ ДЛЯ БИНАРНОГО ВЫХОДА:

// There are dependencies on how you create your floatbuffer for this to work
// I suggest starting with a byte buffer and using asFloatBuffer() when
// you need it as floats.
// ByteBuffer b = ByteBuffer.allocate(somesize);
// FloatBuffer fb = b.asFloatBuffer();
// There will also be endiance issues when you write binary since
// java is big-endian. You can adjust this with Buffer.order(...)
// b.order(ByteOrder.LITTLE_ENDIAN)
// If you're using a hex-editor you'll probably want little endian output
// since most consumer machines (unless you've got a sparc / old mac) are little


FileOutputStream fos = new FileOutputStream("some_binary_output_file_name");
FileChannel channel = fos.getChannel();

channel.write(byteBufferBackingYourFloatBuffer);

fos.close();

ВЫХОД ТЕКСТА: Поскольку вы хотите, чтобы это было доступно для просмотра, я предполагаю, что вы хотите текстовый файл. Вы захотите использовать PrintStream.

// Try-catch omitted for simplicity

PrintStream ps = new PrintStream("some_output_file.txt");
for(int i = 0; i < yourFloatBuffer.capacity(); i++)
{
   // put each float on one line
   // use printf to get fancy (decimal places, etc)
   ps.println(yourFloagBuffer.get(i));
}

ps.close();

Не было времени опубликовать полную сырую / двоичную (нетекстовую) версию этого. Если вы хотите сделать это, используйте FileOutputStream , получите FileChannel и прямо напишите FloatBuffer (поскольку это ByteBuffer )

2 голосов
/ 09 апреля 2009

Если вы хотите, чтобы данные были двоичными:

Начните с ByteBuffer. Позвоните asFloatBuffer, чтобы получить FloatBuffer. Когда вы закончите делать свои вещи, сохраните ByteBuffer в WritableByteChannel.

Если у вас уже есть FloatBuffer, его можно скопировать в буфер с шага 2 с помощью put.

Низкая производительность, но более простой способ - использовать Float.floatToIntBit.

(Наблюдайте за порядком байтов, очевидно.)

0 голосов
/ 09 апреля 2009

Это повторяет массив, поддерживаемый вашим буфером, и выводит каждое число с плавающей запятой. Просто замените текстовый файл и floatBuffer своими собственными параметрами.

PrintStream out = new PrintStream("target.txt");
for(float f : floatBuffer.array()){
  out.println(f);
}
out.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...