Java 字符流與基本IO


字符流基類

java.io包中專門用於字符流處理的類,是以 ReaderWriter 為基礎派生的一系列類。字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節,只能處理字符類型的數據。Reader 是所有的輸入字符流的父類,它是一個抽象類。Writer 是所有的輸出字符流的父類,它也是一個抽象類。二者包含的方法與 InputStream 和 OutputStream 類似,具體可以查看:JDK 1.6 在線中文手冊

InputStreamReader 和 OutputStreamWriter 是 java.io 包中用於處理字符流的最基本的類,用來在字節流和字符流之間作為中介:從字節輸入流讀入字節,並按編碼規范轉換為字符;往字節輸出流寫字符時先將字符按編碼規范轉換為字節。使用這兩者進行字符處理時,在構造方法中應指定一定的平台規范,以便把以字節方式表示的流轉換為特定平台上的字符表示。

Java I/O流

緩存流

同樣的,為了提高字符流處理的效率,java.io 中也提供了緩沖流 BufferedReader 和 BufferedWrite。其構造方法與 BufferedInputStream 和 BufferedOutPutStream 相類似。另外,除了 read() 和 write() 方法外,緩存流還提供了整行字符處理方法:

  1. public String readLine():BufferedReader 的方法,從輸入流中讀取一行字符,行結束標志\n、\r或者兩者一起(這是由具體系統而定的)
  2. 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實用教程 (第三版)_ 耿祥義,張躍平


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM