2017-08-26 68 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

相關問題