私のプログラムは、ファイルのバイト全体に対して計算を行う必要があり、ファイルが特定のサイズを超えると壊れます。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
コマンドラインスイッチを使用してプログラムにメモリ量を割り当てることができることは知っていますが、プログラムでこれを処理するより効果的な方法があるかどうか疑問に思っていますか?
私は基本的に、ファイルをチャンクで読み取り、それらのチャンクを別のメソッドに渡し、そのメソッドでファイルを本質的に再構築する方法を見つけようとしています。
これが問題の方法です。これらのバイトを別のメソッドで使用する必要があります。
このメソッドは、ストリームをバイト配列に変換します。
private byte[] inputStreamToByteArray(InputStream inputStream) {
BufferedInputStream bis = null;
ByteArrayOutputStream baos = null;
try {
bis = new BufferedInputStream(inputStream);
baos = new ByteArrayOutputStream(bis);
byte[] buffer = new byte[1024];
int nRead;
while((nRead = bis.read(buffer)) != -1) {
baos.write(buffer, 0, nRead);
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
return baos.toByteArray();
}
このメソッドは、ファイル タイプをチェックします。
private final boolean isMyFileType(byte[] bytes) {
// do stuff
return theBoolean;
}
それが壊れている理由は私には理にかなっています-巨大なファイルがあり、巨大なバイト配列を渡している場合、バイト配列は巨大になります。
私の目標は、ファイルからバイトを読み取り、作成した別の方法を使用してファイルの種類を判断し、ファイルの種類を判断した後にそれらのバイトに対して圧縮/解凍方法を実行することです。
ファイルストリームと大きなバイト配列を効果的に処理する方法がわかりません。