【问题标题】:How to use inputstream mark and reset functions?如何使用输入流标记和重置功能?
【发布时间】:2013-07-25 14:14:44
【问题描述】:

我正在尝试从文件中读取第一个 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 字节,而不是剩余的。

有什么建议吗?

【问题讨论】:

  • InputStream#mark(int): 标记此输入流中的当前位置。对 reset 方法的后续调用会将此流重新定位到最后标记的位置,以便后续读取重新读取相同的字节。。您只是在回忆 inputStreamToByteArray,它读取 8192 个字节。

标签: java inputstream reset bytearrayoutputstream


【解决方案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;
}

【讨论】:

  • 如何设置我的其他方法,以便它返回该 inputStream 的块?
  • 我不确定你所说的块是什么意思,但 InputStream 有一个方法 read(byte[]) 可以一次读取几个字节并将它们全部放入给定的数组中。所以你可以这样“分块”。
  • 在您指定byte[] finalBytes = inputStreamToByteArray(bis) 的位置,如果文件太大,我会收到内存不足错误。我试图弄清楚在处理超大文件时如何做这部分
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2014-01-02
  • 2010-12-13
  • 2021-02-14
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多