2013-04-20 4 views
1

Я хочу прочитать двоичный файл на Java, который содержит m наборов данных. Я знаю, что каждый набор данных состоит из трех элементов: длинного числа, двойного числа и длинного числа в этой последовательности. Наборы данных повторяются один за другим до конца файла. Предполагая, что число m наборов данных известно, как я могу прочитать файл в Java, не передавая все наборы данных в основную память, чтобы иметь возможность читать и большие файлы, которые не «подходят» в основной памяти?Как читать большой двоичный файл в Java

+1

'java.io.FileInputStream'' java.io.DataInputStream' 'readLong()' 'readDouble()' – johnchen902

+0

Я бы посмотрел Apache Commons FileUtils http://commons.apache.org/proper/commons- И.О./apidocs/орг/Apache/Обще/IO/FileUtils.html. Это часто лучше стандартных утилит –

+0

@ peter.murray.rust - за исключением того, что у него нет методов работы с бинарными файлами. –

ответ

3

Если вы хотите последовательный доступ:

import java.io.FileInputStream; 
import java.io.DataInputStream; 

DataInputStream dis = new DataInputStream(new FileInputStream("input.bin")) 
for(int i = 0; i < m; i++){ 
    long l1 = dis.readLong(); 
    double d1 = dis.readDouble(); 
    long l2 = dis.readLong(); 
    /* do what you need */ 
} 
dis.close(); 
0

Если «запись» в вашем файле имеет фиксированный размер, вы можете использовать RandomAccessFile и, в частности метод seek, чтобы перейти к позиции, которую вы хотите читать , API также предоставляет методы для чтения длин и удвоений.

У меня есть инструкция: «Наборы данных не должны считываться в основной памяти». Как я могу это решить?

Используйте seek, чтобы разместить файл и только прочитать наборы данных, которые необходимо прочитать.

+0

У меня есть инструкция: «Наборы данных не должны считываться в основной памяти». Как я могу это решить? – arjacsoh

0

Я использовал java.nio http://download.oracle.com/javase/7/docs/api/java/nio/package-summary.html, который обеспечивает буферизацию, поскольку мне нужны дополнительные функции, такие как установка порядка байтов. В дополнение к решению johnchen902 вы считываете количество байтов в своем буфере из потока и помещаете их в буфер.

Смежные вопросы