0

Javaコードでcomp3およびEBCIDIC文字を変換しようとしていますが、処理されるデータ量が約5 GBであるため、メモリ不足の例外が発生します。私のコードは現在次のとおりです。

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

これにより、メモリ不足の例外が発生しますが、これは理解できますが、ファイル内のデータが行に分割されないため、ファイル スキャナーも使用できません。

これを処理する方法について誰かが正しい方向に私を向けることができますか

注: ファイルには異なる長さのレコードが含まれている可能性があるため、レコード長の継ぎ目に基づいてファイルを分割することはできません。

4

2 に答える 2

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;
} 

すべてのレコード同じ長さの場合、レコード長の配列を作成すると、上記のメソッドは一度に 1 つのレコードを読み取ります。

最後に、JRecordプロジェクトには、固定長ファイルなどを読み取るためのクラスがあります。これは、comp-3 変換を行うことができます。注: 私は JRecord の作成者です。

于 2015-10-15T23:13:39.300 に答える