处理大型文件在java中的comp3和ebcidic到ASCII的转换



我试图转换comp3和EBCIDIC字符在我的java代码,但我运行到内存不足的异常,因为处理的数据量是巨大的约5 gb。我的代码目前如下:

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

这会导致内存不足的异常,我可以理解,但我不能使用文件扫描仪,因为文件中的数据不会被分成几行。

谁能告诉我如何处理这件事的正确方向?

注意:文件可能包含不同长度的记录,因此不可能根据记录长度拆分它。

正如Bill所说,你可以(应该)要求将数据转换为主机上的显示字符,如果你说英语,你可以进行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项目有类来读取固定长度的文件等。它可以做comp3转换。注:我是JRecord的作者。

我遇到内存不足的异常,因为处理的数据量是巨大的,大约5gb。

你一次只需要读一条记录。

我的代码目前如下:

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

这导致内存不足的异常,我可以理解

我也是。

但是我不能使用文件扫描仪,因为文件中的数据不会被分成几行。

你的意思是你不能使用Scanner类?这不是一次读取记录的唯一方法。

在任何情况下,不是所有文件都有记录分隔符。有些具有固定长度的记录,有些在每个记录的开始处具有长度字,有些在每个记录的开始处具有记录类型属性,或者在两种情况下至少在记录的固定部分具有记录类型属性。

我将不得不拆分它基于属性record_id在一个特定的位置(说在每条记录的开始),这将告诉我记录长度

因此读取该属性,必要时解码它,并根据从该属性派生的记录长度读取记录的其余部分。一次一个。

我建议你注意DataInputStream,特别是readFully()的方法。您还需要一个Java COMP-3库。有几种可用的。其余的大部分可以通过内置的EBCDIC字符集解码器完成。

最新更新