为什么BufferedInputStream #reset()没有抛出RuntimeException?

时间:2017-08-26 19:03:00

标签: java file-io jvm inputstream

BufferedInputStream#mark(int)函数作为参数获取可读取的字节数限制,一旦读取,标记就会失效。

在OCP书中, mark(int)被描述为:

  

...您可以使用预读限制值调用mark(int)。那你可以   根据需要读取尽可能多的字节数。

所以下面的代码是将限制值设置为1个字节,在读取该字节后,标记应该无效并且调用.reset()函数应该抛出RuntimeException,但它没有发生。 JVM是否以某种方式覆盖了传递给mark功能的参数?

public class Main {


public static void main(String[] args) throws IOException {

    Path path = Paths.get("Java8_IOandNIO\\src\\main\\resources\\abcd.txt");

    File f = new File(path.toString());

    FileInputStream fis = new FileInputStream(f);
    BufferedInputStream bis = new BufferedInputStream(fis);

    bis.mark(1);

    System.out.println((char) bis.read());
    System.out.println((char) bis.read());
    System.out.println((char) bis.read());

    bis.reset();

    System.out.println("called reset");

    System.out.println((char) bis.read());
    System.out.println((char) bis.read());
    System.out.println((char) bis.read());
  }
}

每次代码都打印样本文件中的数据:

A
B
C
called reset
A
B
C

2 个答案:

答案 0 :(得分:1)

嗯,文档(来自InputStream的原始合同)声明:

  

如果自创建流以来尚未调用方法标记,或者自上次调用mark以来从流中读取的字节数大于最后一次调用时标记的参数,则IOException 可能被抛出。

(强调我的)

这意味着限制是推荐。在读取该字节数后,标记不必是无效的。

答案 1 :(得分:0)

由于:

  • 你引用的OCP并没有说什么关于投掷RuntimeException;
  • 它并不能说你不一定能读更多内容;
  • OCP不是规范性参考文献;
  • real normative reference也没有这样说;和
  • 流被缓冲,因此它可以支持最大内部缓冲区大小的标记,目前为8192字节。