Java 是否可以多次使用流?

Java 是否可以多次使用流?,java,inputstream,Java,Inputstream,简而言之,我需要用一个流做两件事 我需要通过一个方法传递一个流,以查看该流的字节是否属于特定类型 检查完成后,我需要使用该流创建一个新类 我对流非常陌生,我知道它们是“单向的街道”,所以如果我发现自己需要重用流,我认为我的代码中有一个糟糕的设计 这里是一个逻辑的小片段: byte[] header = new byte[1024]; //reads entire array or until EOF whichever is first bis.mark(header.length); bis.

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

  • 我需要通过一个方法传递一个流,以查看该流的字节是否属于特定类型

  • 检查完成后,我需要使用该流创建一个新类

  • 我对流非常陌生,我知道它们是“单向的街道”,所以如果我发现自己需要重用流,我认为我的代码中有一个糟糕的设计

    这里是一个逻辑的小片段:

    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;
    }
    

    通常,您无法重置InputStream以返回开始。但是,有一些mark()/reset()方法可以使流记住当前位置,并且可以使用reset()将流倒回到标记的位置

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


    编辑:如果仍然使用ByteArrayInputStream,则整个长度上都支持标记/重置(自然)。

    这完全取决于
    InputStream
    实现是否支持
    mark()
    。看见在不支持
    mark()
    的流上调用
    reset()
    可能会引发异常

    BufferedInputStream
    ByteArrayInputStream
    支持
    mark()
    ,但其他人不支持