当前位置: 首页 > 知识库问答 >
问题:

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

单于耘豪
2023-03-14

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

有什么建议吗?

共有1个答案

米修平
2023-03-14

首先,看起来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;
}
 类似资料:
  • 问题内容: 我知道Java中有一个函数可以使用method 将标准输出流设置为任何用户定义的值。 但是,是否有任何方法可以将标准输出重置为先前存储的标准输出还是标准输出? 问题答案: 您可以通过持有标准的文件描述符。要重置标准以打印到控制台,您可以 另一种方法是仅保留原始对象,如下所示:

  • 我有一个输入流,其中包含XML数据,我想在返回输入流之前对其进行解析。 当然,我可以将流保存为字节数组,并从中返回一个新的InputStream,或者 在“myObj”上创建第二个InputStream。 但是有什么方法可以“即时”解析流吗? 编辑: 基本上,我正在寻找一种在解析后重用流的方法。在不消耗流的情况下解析流,分别在解析后重置流。 解决方案: 我找到的解决方案是使用BufferedInp

  • 我目前正在处理一个视频标签: 它被绑定到一个交叉点观察器,该观察器触发了它的autoplay属性。当视频是不可见的,我想重置它,使它回到它的原始状态(显示海报)。 目前我正在这样做: 这是可行的,但我在浏览器重新加载我的页面时遇到了麻烦(这可能是方法造成的,也可能不是。 有更好的方法重置视频吗?

  • 问题内容: 我有一个用Python编写的控制台程序。它使用以下命令询问用户问题: 如何测试包含对using的调用的函数?我不想强迫测试人员多次输入文本只是为了完成一次测试运行。 问题答案: 您可能应该模拟内置功能,可以在每次测试后使用提供的功能还原为原始功能。 更好的解决方案是将模块与一起使用。这样,您就不需要使用拆解,并且修补的方法只会存在于范围内。

  • 问题内容: 出于我自己的目的,我试图在Java中构建一个标记器,在其中可以定义常规语法,并根据该标记对输入进行标记。不建议使用StringTokenizer类,并且我在Scanner中发现了几个函数,这些函数可以提示我要执行的操作,但还没有运气。有人知道解决这个问题的好方法吗? 问题答案: “扫描程序”的名称有点误导,因为该词通常用于表示词法分析器,而这并不是Scanner的意思。所有这些都可以替

  • 我正在使用输入流对象来计算某个文件的 Md5。我标记流 稍后我重置流。但是,对于大文件,会出现以下异常... 例外情况 我已经尝试过用这种方式关闭流并重新打开它..只是得到一些如下的异常: 然而,当我尝试重新使用新检索的InputStream时,出现了以下异常。