Обработка 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.