Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理大型文件的java到ASCII的comp3和ebcidic转换_Java_File_Ebcdic_Comp 3 - Fatal编程技术网

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

处理大型文件的java到ASCII的comp3和ebcidic转换,java,file,ebcdic,comp-3,Java,File,Ebcdic,Comp 3,我试图在我的java代码中转换comp3和EBCIDIC字符,但是我遇到了内存不足的异常,因为处理的数据量非常大,大约为5 gb。我的代码目前如下: byte[] data = Files.readAllBytes(path); 这会导致内存不足异常,我可以理解,但我不能使用文件扫描仪,因为文件中的数据不会被分割成行 有人能告诉我如何处理这个问题的正确方向吗 注意:文件可能包含不同长度的记录,因此无法根据记录长度对其进行拆分 正如比尔所说,你可以(应该)要求将数据转换成大型机上的显示字符,如果

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

byte[] data = Files.readAllBytes(path);
这会导致内存不足异常,我可以理解,但我不能使用文件扫描仪,因为文件中的数据不会被分割成行

有人能告诉我如何处理这个问题的正确方向吗


注意:文件可能包含不同长度的记录,因此无法根据记录长度对其进行拆分

正如比尔所说,你可以(应该)要求将数据转换成大型机上的显示字符,如果说英语,你可以进行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;
} 
protectedfinal int readBuffer(InputStream-in,final byte[]buf)
抛出IOException{
int-total=0;
int num=in.read(基本单位,总计,基本单位长度);
而(num>=0&&total+num
如果所有记录长度相同,则创建一个记录长度数组,上述方法将一次读取一条记录

最后,该项目有类读取固定长度的文件等。它可以做comp-3转换。注:我是JRecord的作者

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

一次只需读取一条记录

我的代码目前如下:

byte[] data = Files.readAllBytes(path);
这导致了我能理解的内存不足异常

我也是

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

你是说你不能使用
扫描器
类?这不是一次读取记录的唯一方法

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

我必须根据一个属性record_id在一个特定的位置(比如在每个记录的开头)拆分它,该位置将告诉我记录的长度

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


请注意
DataInputStream
的方法,尤其是
readFully()
。您还需要一个Java COMP-3库。有几种方法可供选择。其余大部分都可以通过内置EBCDIC字符集解码器来完成。

您可以一次处理一条记录。永远不需要将整个文件加载到内存中。编译器不会这样做:为什么要这样做?我同意你的看法,我不想一次加载整个文件,但记录长度是不同的,比如说,前10行140个字符,20-30 40个字符40-45个字符。这些记录由记录中的记录id标识。我怀疑根据你没有的块大小进行抓取。您可以根据记录大小获取它。不知何故,读取此文件的原始程序一次读取一条记录。你也可以。这些记录中有一个长度字或一个固定分隔符。告诉我们。没有分隔符,它只是连续的数据,我必须根据属性记录id在特定位置(比如在每个记录的开头)拆分它,以告诉我记录的长度。不知何故,这些记录必须是自定义的。如果您可以通过将整个文件读入内存来分离它们,这就是您在这里所声称的,那么您可以一次分离一个。否则,这项任务无论如何都不可能完成。您需要提供一些有关格式的信息。如果记录以一个长度字开头,没有什么可以阻止您读取长度字,然后读取记录的其余部分。此方法:
DataInputStream.readFully()
也将填充一个字节数组,测试效果更好。是的,此方法可以很好地工作,但有时我也会有不同长度的记录。我希望rad文件在相当大的块处理它的基础上记录标识符。如果区块中有一些剩余数据,因为记录的长度可变,我想重置为以前的偏移量,并在新区块中继续处理。听上去,您有没有RDW(记录描述符字,实际上它只是记录长度)的大型机VB文件。从大型机向其他平台发送VB文件时,删除RDW往往是默认设置。向PC发送VB文件时,通常有一个保留RDW的选项。我认为保留RDW更安全。JRecord有读取大型机VB文件的例程(无论是字节数组还是它自己的行类),我同意你的看法,目前我也有类似的块读取方法。根据记录id识别记录并对其进行处理。对其使用mappedBuffer,并在偏移量中面临问题,因为偏移量为int且文件大小超过该值。。我相信,在尝试使用DatainputStream进行读取时,我也会遇到类似的问题。mb=ch.map(FileChannel.MapMode.READ_ONLY,prevZ,bufLength*lineLength);get(数据、prevZ、nGet);prevZ是成功读取的最后一个记录位置,soi可以重置并获取新的块,但这有时会超过int范围,最终导致负值