是否可以多次使用流?

时间:2013-07-26 14:03:48

标签: java inputstream

简而言之,我需要用一个流做两件事。

  1. 我需要通过一个方法传递一个流来查看该流的字节是否属于特定类型。

  2. 我需要在检查完成后使用该流创建一个新类。

  3. 我对溪流非常陌生,我知道他们是“单行道”。#34;因此,如果我发现自己需要重用流,我认为我的代码设计不好。

    以下是逻辑的一部分:

    byte[] header = new byte[1024];
    //reads entire array or until EOF whichever is first
    bis.mark(header.length);
    bis.read(header);
    
    if(isFileType(header)) {
       bis.reset();
      _data.put(fileName, new MyClass(bis)); // Stream is now closed...
      methodForFinalBytes(bis);
    } else {
      // Do other stuff;
    }
    

2 个答案:

答案 0 :(得分:1)

通常,您无法重置InputStream以返回到开头。但是有mark()/ reset()方法,它们使流记住当前位置,你可以使用reset()将流回放到标记位置。

问题是,它们是可选的,并且可能不受所使用的特定流类的支持。 BufferedInputStream支持mark()/ reset()(尽管在缓冲区限制内)。您可以将InputStream包装在BufferedInputStream中,立即标记()然后运行检测代码(但要确保它不会比缓冲区大小更进一步读取,您可以在BufferedInputStream构造函数中指定缓冲区大小)。然后调用reset()并真正读取流。

编辑:如果您仍然使用ByteArrayInputStream,那么它支持标记/重置整个长度(自然)。

答案 1 :(得分:1)

完全取决于InputStream实施是否支持mark()。见http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#markSupported()。在不支持reset()的流上调用mark()可能会引发异常。

BufferedInputStreamByteArrayInputStream支持mark(),但其他人则不支持。{/ p>