处理java中的comp3和ebcidic转换为大文件的ASCII

时间:2015-10-15 07:56:32

标签: java file ebcdic comp-3

我正在尝试在我的java代码中转换comp3和EBCIDIC字符,但我遇到了内存不足异常,因为处理的数据量大约为5 GB。我的代码目前如下:

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

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

任何人都可以指出我如何处理这个

的正确方向

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

2 个答案:

答案 0 :(得分:0)

正如比尔所说,您可以(应该)要求将数据转换为在大型机上显示字符,如果说英语,您可以进行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的作者。

答案 1 :(得分:0)

  

由于处理的数据量大约为5 GB,我遇到内存不足异常。

您只需要一次读取一条记录。

  

我的代码目前如下:

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

这导致内存不足异常,我能理解

我也是。

  

但我也不能使用文件扫描程序,因为文件中的数据不会被分成行。

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

在任何情况下,并非所有文件都有记录分隔符。有些具有固定长度的记录,有些在每条记录的开头有长度字,有些在每条记录的开头都有记录类型属性,或者至少在记录的固定部分都有记录类型属性。

  

我必须根据特定位置(比如每条记录的开头)的属性record_id将其拆分,这将告诉我记录长度

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

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