2

8192ファイルから最初のバイトを読み取り、ブール値を返すメソッドを介してそれらのバイトを実行 しようとしています。

そのブール値は、ファイルが特定のタイプであるかどうかを教えてくれます。

メソッドがファイル タイプのバイトに対して true を返した場合、残りのバイトを取得して別のメソッドで実行します。false の場合、残りのバイトを別の方法で実行します。

マークを使用しようとしていますが、成功していません。

private final void handleFile(InputStream inputStream) {

   BufferedInputStream bis = new BufferedInputStream(inputStream);
   bis.mark(8192);
   byte[] startingBytes = inputStreamToByteArray(bis);

   if(startingBytes.length == 0) { return; }

   byte[] finalBytes;
   if(isFileType(startingBytes)) {
      bis.reset();
      finalBytes = inputStreamToByteArray(bis);
      methodForFinalBytes(finalBytes);
   } else {
      // Do other stuff;
   }
}

private byte[] inputStreamToByteArray(InputStream inputStream) {
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   byte[] buffer = new byte[8192];

   try {
      while(inputStream.read(buffer) != -1) {
          baos.write(buffer);
      }
   } catch(IOException ioe) {
      ioe.printStackTrace();
   }

return baos.toByteArray();
}

問題は、バイト配列をチャンクに保持しながら(大きなファイルに対する処理のために)、中断したところから再開することです。また、8192残りのバイトではなくバイトのみが返されます。

助言がありますか?

4

1 に答える 1

1

inputSTreamToByteArray()まず、最初の 8192 バイトだけでなく、ファイルの終わりまでストリーム全体を読み取っているように見えます。おそらく、最初の 8192 バイトを最初に個別に読み取る必要があります。

次に、それらのバイトをもう一度読み直しますか? そうでない場合は、マーク/リセットする必要があるかどうかわかりません。(特に、バイト配列がまだあるため)

以下のコードは、最初の 8192 バイトを最初に読み取り、次に何をすべきかを決定します。

byte[] header = new byte[8192];
//reads entire array or until EOF whichever is first
bis.read(header);

if(isFileType(header)) {
  byte[] finalBytes = inputStreamToByteArray(bis);
  methodForFinalBytes(finalBytes);
} else {
  // Do other stuff;
}
于 2013-07-25T15:31:14.887 に答える