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
答案 0 :(得分:1)
嗯,文档(来自InputStream的原始合同)声明:
如果自创建流以来尚未调用方法标记,或者自上次调用mark以来从流中读取的字节数大于最后一次调用时标记的参数,则IOException 可能被抛出。
(强调我的)
这意味着限制是推荐。在读取该字节数后,标记不必是无效的。
答案 1 :(得分:0)
由于:
RuntimeException
;