2015-06-27 46 views
-1

我做了一個程序,故意引入了一個bug,使FileInputStream對象讀過EOF字符。但是,這似乎並沒有讓它產生任何例外。`FileInputStream`超過EOF - 爲什麼會產生怪異行爲而不是拋出異常?

  • 此對象不知道它是否已經超過文件的EOF符號 ?
  • 爲什麼System.out.print()在EOF符號到達後在我的終端控制檯中停止打印?鑑於...
  • FileOutputStream繼續無限期地打印出奇怪的符號到outagain.txt文件?這個奇怪的符號是什麼?在我提交這個問題時,我設法生成了一個佔用50MB硬盤空間的文本文件。

這裏是文本文件xanadu.txt和產生怪異行爲的程序。

In Xanadu did Kubla Khan 
A stately pleasure-dome decree: 
Where Alph, the sacred river, ran 
Through caverns measureless to man 
Down to a sunless sea. 

import java.io.*; 

public class CopyBytes { 
    public static void main(String[] args) throws IOException { 
     FileInputStream in = null; 
     FileOutputStream out = null; 

     try { 
      in = new FileInputStream("xanadu.txt"); 
      out = new FileOutputStream("outagain.txt"); 

      while (true) { 
       int ch = in.read(); 
       out.write(ch); 
       System.out.print((char)ch); 
      } 
     } 
     finally { 
      if (in != null) 
       in.close(); 
      if (out != null) 
       out.close(); 
     } 
    } 
} 
+0

什麼'FileInputStream#read'呢? –

+0

_爲什麼System.out.print()在到達EOF符號後停止在終端控制檯中打印?_不。它會不斷打印與整數值「-1」相關聯的字符,這在您的終端上可能不可見。 –

+0

沒有'EOF字符'。有一個你忽略的EOF *返回值*。所以你再次得到它。然後再次。然後再次。在這裏你不是'過去'的任何東西,你只是陷入了一個無限循環。你應該拋出一個'EOFException'的期望是毫無根據的。 – EJP

回答

1

in.read()沒有記錄,當它到達EOF拋出異常。它返回-1。所以你會連續寫入-1無限循環。它的行爲如文件記錄。

Doc:InputStream.read()

相關問題