文件輸入輸出流 FileInputStream 和 FileOutputStream 負責完成對本地磁盤文件的順序輸入輸出操作。
【示例1】通過程序創建一個文件,從鍵盤輸入字符,當遇到字符#時結束,在屏幕上顯示該文件的所有內容。
運行后在程序目錄建立一個名稱為 www_weixueyuan_net.txt 的文件,運行結果為:
FileDescriptor 是 java.io 中的一個類,該類不能實例化,其中包含三個靜態成員:in、out 和 err,分別對應于標準輸入流、標準輸出流和標準錯誤流,利用它們可以在標準輸入輸出流上建立文件輸入輸出流,實現鍵盤輸入或屏幕輸出操作。
【示例2】實現對二進制圖形文件(.gif)的備份。
運行后在程序目錄備份了一個名稱為 www.weixueyuan.net_log_back.gif 的文件,運行結果:
文件的大小為:15951
文件已經被更名賦值!
FilterInputStream 和 FileOutputStream 是 InputStream 和 OutputStream 的直接子類,分別實現了在數據的讀、寫操作的同時能對所傳輸的數據做指定類型或格式的轉換,即可實現對二進制字節數據的理解和編碼轉換。
常用的兩個過濾流是數據輸入流 DataInputStream 和數據輸出流 DataOutputStream。其構造方法為:
DataInputStream(InputStream in); //創建新輸入流,從指定的輸入流 in 讀數據
DataOutputStream(OutputStream out); //創建新輸出流,向指定的輸出流 out 寫數據
由于 DataInputStream 和 DataOutputStream 分別實現了 DataInput 和 DataOutput 兩個接口(這兩個接口規定了基本類型數據的輸入輸出方法)中定義的獨立于具體機器的帶格式的讀寫操作,從而實現了對不同類型數據的讀寫。由構造方法可以看出,輸入輸出流分別作為數據輸入輸出流的構造方法參數,即作為過濾流必須與相應的數據流相連。
DataInputStream 和 DataOutputStream 類提供了很多個針對不同類型數據的讀寫方法,具體內容讀者可參看 Java 的幫助文檔。
【示例3】將三個 int 型數字 100、0、-100 寫入數據文件 www.weixueyuan.net.dat 中。
運行后在程序目錄中生成數據文件 www.weixueyuan.net.dat,用文本編輯器打開后發現內容為二進制的:
0000 0064 0000 0000 ffff ff9c
【示例4】讀取數據文件 www.weixueyuan.net.dat 中的三個 int 型數字,求和并顯示。
運行結果:
三個數的和為:0
readInt 方法可以從輸入輸出流中讀入 4 個字節并將其作為 int 型數據直接參與運算。由于已經知道文件中有 3 個數據,所以可以使用 3 個讀入語句,但若只知道文件中是 int 型數據而不知道數據的個數時該怎么辦呢?因為 DataInputStream 的讀入操作如遇到文件結尾就會拋出 EOFException 異常,所以可將讀操作放入 try 中。
EOFException 是 IOException 的子類,只有文件結束異常時才會被捕捉到,但如果沒有讀到文件結尾,在讀取過程中出現異常就屬于 IOException。
【示例5】從鍵盤輸入一個整數,求該數的各位數字之和。
運行結果:
請輸入一個整數:26
842403082 的各位數字之和=31
需要注意的是,輸入的數據 26 為變成了 842403082,原因在于輸入數據不符合基本類型數據的格式,從鍵盤提供的數據是字符的字節碼表示方式,若輸入 26,只代表 2 和 6 兩個字符的字節數據,而不是代表整數 26 的字節碼。
若要從鍵盤得到整數需要先讀取字符串,再利用其他方法將字符串轉化為整數。
System.in、System.out、System.err 這 3 個標準輸入輸流對象定義在 java.lang.System 包中,這 3 個對象在 Java 源程序編譯時會被自動加載。
標準輸入 System.in 是 BufferedInputStream 類的對象,當程序需要從鍵盤上讀入數據時,只需要調用 System.in 的 read() 方法即可,該方法從鍵盤緩沖區讀入一個字節的二進制數據,返回以此字節為低位字節,高位字節為 0 的整型數據。
標準輸出 System.out 是打印輸出流 PrintStream 類的對象。PrintStream 類是過濾輸出流類 FilterOutputStream 的一個子類,其中定義了向屏幕輸出不同類型數據的方法 print() 和 println()。
標準錯誤輸出 System.err 用于為用戶顯示錯誤信息,也是由 PrintStream 類派生出來的錯誤流。Err 流的作用是使 print() 和 println() 將信息輸出到 err 流并顯示在屏幕上,以方便用戶使用和調試程序。
【示例6】輸入一串字符顯示出來,并顯示 System.in 和 System.out 所屬的類。
運行結果:
需要注意的是,輸入了 3 個字符按回車后,輸出的結果顯示為 5 個字符。這是由于 Java 中回車被當作兩個字符,一個是 ASCII 為 13 的回車符,一個是值為 10 的換行符。程序中 getClass() 和 ToString() 是 Object 類的方法,作用分別是返回當前對象所對應的類和返回當前對象的字符串表示。