2011-11-16 4 views
1

Javaのバイト配列でデータをより効率的に分割する方法はありますか? 固定長データフィールドを持つバイナリファイルを読み込むために、次の関数を記述しました。しかしパフォーマンスは非常に遅いので、300バイトの長さを持つ30,000レコードのバイナリファイルを読み込み、各レコードには240フィールドが必要です。 アドバイスはありますか?バイト配列を分割してJavaクラスオブジェクトのフィールドをマップする効率的な方法

public void breakField(byte[] input) { 

    ByteArrayInputStream bais = new ByteArrayInputStream(input); 

    byte[] tmp = new byte[2]; 
    bais.read(tmp); 
    this.id = new String(tmp); 

    tmp = new byte[4]; 
    bais.read(tmp); 
    this.name = new String(tmp); 

    tmp = new byte[8]; 
    bais.read(tmp); 
    this.phone = new String(tmp); 

    tmp = new byte[15]; 
    bais.read(tmp); 
    this.otherInfo = new String(tmp); 

    .... more fields... 

}  
+1

フィールド単位ではなくレコード単位(300バイトごと)のファイルを読み取り、読み取ったデータを後でメモリのデータフィールドに分割してみます –

答えて

2

byte[]配列にファイル全体を読み込むことにより、ファイルがJVMにメモリ内で利用可能なスペースの量よりも大きい場合、あなたはOutOfMemoryErrorを取得します。

代わりにBufferedReaderFileReaderを組み合わせて使用​​できます。これにより、ファイル全体をメモリにロードせずにファイルを読み取ることができます。

BufferedReader in = new BufferedReader(new FileReader("/path/to/my/file")); 

データレコードごと、単にあなたがBufferedReader.readを呼び出す時に300バイト単位で読みをロードします。一度に300バイトを読み取るのではなく、個々のフィールドを扱うことを好む場合は、次のフィールドの長さに対応するバイト数を読み取るだけです。

関連する問題