如何使用输入流标记和重置功能?

时间:2013-07-25 15:23:07

标签: java inputstream reset bytearrayoutputstream

我正在尝试从文件中读取第一个8192字节,并通过返回布尔值的方法运行这些字节。

该布尔告诉我文件是否属于特定类型。

如果方法在文件类型I的字节上返回true,则希望获得剩余的字节并通过不同的方法运行它们。如果为false,则通过其他方法运行剩余的字节。

我正在尝试使用mark,但没有成功。

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个字节,而不是剩余的。

有什么建议吗?

1 个答案:

答案 0 :(得分: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;
}