字符流基類
java.io包中專門用於字符流處理的類,是以 Reader 和 Writer 為基礎派生的一系列類。字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節,只能處理字符類型的數據。Reader 是所有的輸入字符流的父類,它是一個抽象類。Writer 是所有的輸出字符流的父類,它也是一個抽象類。二者包含的方法與 InputStream 和 OutputStream 類似,具體可以查看:JDK 1.6 在線中文手冊。
InputStreamReader 和 OutputStreamWriter 是 java.io 包中用於處理字符流的最基本的類,用來在字節流和字符流之間作為中介:從字節輸入流讀入字節,並按編碼規范轉換為字符;往字節輸出流寫字符時先將字符按編碼規范轉換為字節。使用這兩者進行字符處理時,在構造方法中應指定一定的平台規范,以便把以字節方式表示的流轉換為特定平台上的字符表示。
緩存流
同樣的,為了提高字符流處理的效率,java.io 中也提供了緩沖流 BufferedReader 和 BufferedWrite。其構造方法與 BufferedInputStream 和 BufferedOutPutStream 相類似。另外,除了 read() 和 write() 方法外,緩存流還提供了整行字符處理方法:
- public String readLine():BufferedReader 的方法,從輸入流中讀取一行字符,行結束標志\n、\r或者兩者一起(這是由具體系統而定的)
- public void newLine():BufferedWriter 的方法,向輸出流中寫入一個行結束標志,它不是簡單地換行符\n或\r,而是系統定義的行隔離標志(line separator)。
文件流
與 FileInputStream 、FileOutputStream 字節流相對應的是 FileReader、FileWriter 字符流,其分別是 Reader 和 Writer 的子類,構造方法分別如下:
FileReader(String filename); FileWriter(String filename);
字節流不能直接操作 Unicode 字符,所以 Java 提供了字符流。由於漢字在文件中占用兩個字節,如果使用字節流,讀取不當會出現亂碼現象,采用字符流就可以避免這個現象,因為,在 Unicode 字符中,一個漢字被看作一個字符。
FileReader 流順序的讀取文件,只要不關閉流,每次調用 read 方法就順序地讀取源中其余的內容,直到源的末尾或流被關閉。有的時候需要整行讀取,比如一個學生名單文件,每個姓名占一行,想要讀取名字的話就必須讀取一行,但是 FileReader 類沒有提供這種方法,可以使用上面的緩存流中介紹的兩個方法。類似地,可以將 BuffeerWriter 流和 FileWriter 流連接在一起,然后使用 BufferWriter 流將數據寫到目的地。
基本IO
讀取輸入
Java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。讀取“標准輸入流”System.in(即通過控制台進行輸入),首先需要構造一個 Scanner 對象,並與“標准輸入流”System.in關聯。
Scanner in = new Scanner(System.in);
然后就可以使用Scanner類的各種方法實現輸入操作了,下面是常用的一些方法:
| 方法 | 描述 |
|------|------|
| String nextLine() | 讀取輸入的下一行內容 |
| String next() | 讀取輸入的下一個單詞(以空格作為分隔符) |
| int nextInt() | 讀取並轉換下一個表示整數的字符序列 |
| double nextDouble() | 讀取並轉換下一個表示浮點數的字符序列 |
| boolean hasNext() | 檢測輸入中是否還有其他單詞 |
| boolean hasNextInt() | 檢測是否還有表示整數的下一個字符序列 |
| boolean hasNextDouble() | 檢測是否還有表示浮點數的下一個字符序列 |
>**注:**在讀取前我們一般需要用相應的 has 方法判斷是否還有輸入的數據。next方法會自動去掉有效字符之前的空格。Scanner 類定義在java.util包中,在程序的最開始應添加上一行:
>```java
>import java.util.*;
>```
格式化輸出
print方法將以對應數據類型所允許的最大非零數字位數打印輸出,如:
double x = 10000.0/3.0; System.out.print(x);
會打印:3333.3333333333335。
Java SE 5.0沿用了C語言庫函數中的printf方法,格式說明符的語法圖如下:
參數索引、美元符號及t與日期和時間的格式化輸出有關,具體可以查看:Java.util 包 Data類:日期格式化。
用於printf的標志:
用於printf的轉換字符:
println方法就是輸出並終止行。這些方法都由類PrintStream定義,System.out是該類對象的一個引用。PrintStream繼承了OutoutStream類,並且實現了方法write(),但實際上沒有上面的方法方便,並不經常使用。
文件輸入與輸出
//構造一個從給定未見讀取數據的Scanner Scanner(File f); //構造一個給定字符串讀取數據的Scanner Scanner(String data); //構造一個將數據寫入給定文件的PrintWriter PrintWriter(File f); //構造一個將數據寫入文件的PrintWriter。 PrintWriter(String fileName); //用給定文件名,構造一個描述文件的File對象。注意這個文件當前不必存在。 File(String fileName);
如果用一個不存在的文件構造一個Scanner,或者用一個不能被創建的文件名構造一個PrintWriter,那么就會發生異常。成功創建了Scanner對象后,就可以使用上面介紹的常用方法來從文件讀取,而PrintWriter也可以使用print、printf和println來寫入文件。還有需要注意的是,Scanner構造方法直接寫字符串的文件名的話,它會直接把這個字符串當做輸入,而不是從文件讀取。
參考資料
- 實驗樓:JDK 核心 API
- Java核心技術 卷Ⅰ基礎知識 原書第8版
- Java2實用教程 (第三版)_ 耿祥義,張躍平