0

私のプログラムは、ファイルのバイト全体に対して計算を行う必要があり、ファイルが特定のサイズを超えると壊れます。

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

それが壊れている理由は私には理にかなっています-巨大なファイルがあり、巨大なバイト配列を渡している場合、バイト配列は巨大になります。

私の目標は、ファイルからバイトを読み取り、作成した別の方法を使用してファイルの種類を判断し、ファイルの種類を判断した後にそれらのバイトに対して圧縮/解凍方法を実行することです。

ファイルストリームと大きなバイト配列を効果的に処理する方法がわかりません。

4

1 に答える 1

1

すでに BufferedInputStream を使用しています。蒸気にマークを付けるには「マーク」メソッドを使用します。「mark」への「readlimit」引数が、ファイル タイプを検出するのに十分な大きさであることを確認してください。ストリームから最初の X バイトを読み取り (ただし、readlimit を超えてはなりません)、コンテンツの把握を試みます。次に、reset() を呼び出してストリームを最初に戻し、ストリームでやりたいことを続けます。

于 2013-07-23T17:41:17.720 に答える