Эффективный способ разбить массив байтов для сопоставления полей в объекте класса Java - PullRequest
1 голос
/ 16 ноября 2011

Есть ли более эффективный способ разбить данные в байтовом массиве в Java?Я написал следующую функцию для чтения двоичного файла с полем данных фиксированной длины.Но производительность действительно низкая, мне нужно прочитать двоичный файл с 30000 записей каждая длиной 300 байт, и каждая запись содержит 240 полей.Любой совет?

public void breakField(byte[] input) {

    ByteArrayInputStream bais = new ByteArrayInputStream(input);

    byte[] tmp = new byte[2];
    bais.read(tmp);
    this.id = new String(tmp);

    tmp = new byte[4];
    bais.read(tmp);
    this.name = new String(tmp);

    tmp = new byte[8];
    bais.read(tmp);
    this.phone = new String(tmp);

    tmp = new byte[15];
    bais.read(tmp);
    this.otherInfo = new String(tmp);

    .... more fields...

}       

1 Ответ

2 голосов
/ 16 ноября 2011

При чтении всего файла в массив byte[], если файл больше, чем объем пространства, доступного в памяти для JVM, вы получите OutOfMemoryError.

Вместо этого вы можете использовать BufferedReader в сочетании с FileReader. Это позволит вам читать файл по частям, не загружая все данные в память.

BufferedReader in = new BufferedReader(new FileReader("/path/to/my/file"));

Чтобы загрузить данные по записи, просто прочитайте 300 байтов за раз, когда вы вызываете BufferedReader.read. Если вы предпочитаете работать с отдельными полями, вместо чтения 300 байтов за раз, просто прочитайте количество байтов, соответствующее длине следующего поля.

...