Обработка comp3 и ebcidic преобразования в java в ASCII для больших файлов

Я пытаюсь преобразовать символы comp3 и EBCIDIC в мой код Java, но у меня возникает исключение из-за нехватки памяти, поскольку объем обрабатываемых данных огромен - около 5 ГБ. мой код в настоящее время выглядит следующим образом:

byte[] data = Files.readAllBytes(path);

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

Кто-нибудь может указать мне правильное направление о том, как справиться с этим

Примечание: файл может содержать записи различной длины, поэтому его разбиение по швам длины записи невозможно.

2 ответа

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

Кроме того, как вы решаете, где начинаются поля comp-3???


Вам не нужно читать весь файл в память, вы все равно можете прочитать файл в блоках, этот метод заполнит массив байтов:

protected final int readBuffer(InputStream in, final byte[] buf)
throws IOException {

    int total = 0;
    int num = in.read(buf, total, buf.length);

    while (num >= 0 && total + num < buf.length) {
        total += num;
        num = in.read(buf, total, buf.length - total);
    }
    return num;
} 

если все записи имеют одинаковую длину, создайте массив с длиной записи, и вышеуказанный метод будет читать по одной записи за раз.

Наконец, проект JRecord имеет классы для чтения файлов фиксированной длины и т. Д. Он может выполнять преобразование в comp-3. Примечание: я автор JRecord.

Я сталкиваюсь с исключением из-за нехватки памяти, так как объем обрабатываемых данных составляет около 5 ГБ.

Вам нужно читать только одну запись за раз.

Мой код в настоящее время выглядит следующим образом:

byte[] data = Files.readAllBytes(path);

Это приводит к исключению нехватки памяти, которое я могу понять

Я тоже.

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

Вы имеете в виду, что вы не можете использовать Scanner учебный класс? Это не единственный способ читать записи одновременно.

В любом случае не все файлы имеют разделители записей. У некоторых есть записи фиксированной длины, у некоторых есть длина слова в начале каждой записи, а у некоторых есть атрибуты типа записи в начале каждой записи, или в обоих случаях, по крайней мере, в фиксированной части записи.

Мне придется разделить его на основе атрибута record_id в определенной позиции (скажем, в начале каждой записи), который сообщит мне длину записи

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

Я обращаю ваше внимание на методы DataInputStream, особенно readFully(), Вам также понадобится библиотека Java COMP-3. Есть несколько доступных. Большая часть остального может быть выполнена с помощью встроенных декодеров набора символов EBCDIC.

Другие вопросы по тегам