2017-08-26 67 views
-1

BufferedInputStream#mark(int)函数将读取的字节数限制为参数,一旦读取,标记将变为无效。为什么BufferedInputStream#reset()没有抛出RuntimeException?

在OCP书标记(INT)被描述为:

...你可以叫马克(INT)与预读限值。然后您可以根据需要读取尽可能多的字节数,直至达到极限值。

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

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 

回答

1

那么,文档(从InputStream原始合同)规定:

如果该方法标记具有不自从创建流以来已被调用,或者自上次调用mark之后从流中读取的字节数大于最后一次调用时标记的参数,则IO Exception 可能为被抛出。

(重点煤矿)

这意味着限制是建议。在读取字节数之后,标记不会失效。

0

因为:

  • 你报不说的扔RuntimeException什么OCP的;
  • 它不说你不一定阅读更多;
  • OCP不是规范性参考文献;
  • real normative reference也不这么说;和
  • 该流被缓冲,因此它可以支持高达其内部缓冲区大小的标记,该标记当前为8192字节。
+0

@downcoter以下哪五项说法不正确? – EJP

相关问题