Java平臺使用Unicode約定存儲字符值,字符流I/O自動將此內部格式與本地字符集進行轉換,在Western語言環境中,本地字符集一般是ASCII的8位超集。html
對於大多數應用程序,具備字符流的I/O並不比具備字節流的I/O複雜,使用流類完成的輸入和輸出會自動轉換爲本地字符集和從本地字符集轉換,使用字符流代替字節流的程序會自動適應本地字符集併爲國際化作了準備 — 全部這些都無需程序員的額外努力。java
若是國際化不是優先事項,你能夠簡單地使用字符流類,而沒必要過多關注字符集問題,以後,若是國際化成爲優先事項,你的程序能夠進行調整而無需進行大量從新編碼。git
全部字符流類都派生自Reader和Writer,與字節流同樣,有專門用於文件I/O的字符流類:FileReader和FileWriter,CopyCharacters示例說明了這些類。程序員
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyCharacters { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader("xanadu.txt"); outputStream = new FileWriter("characteroutput.txt"); int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } }
CopyCharacters
與CopyBytes
很是類似,最重要的區別是CopyCharacters
使用FileReader
和FileWriter
代替FileInputStream
和FileOutputStream
進行輸入和輸出。請注意,CopyBytes
和CopyCharacters
都使用int
變量來讀取和寫入,可是,在CopyCharacters
中,int
變量在其最後16位中保存一個字符值,在CopyBytes
中,int
變量在其最後8位中保存一個字節值。github
字符流一般是字節流的「包裝器」,字符流使用字節流來執行物理I/O,而字符流處理字符和字節之間的轉換,例如,FileReader
使用FileInputStream
,而FileWriter
使用FileOutputStream
。segmentfault
有兩種通用的字節到字符「橋接」流:InputStreamReader和OutputStreamWriter,當沒有符合你需求的預打包字符流類時,使用它們來建立字符流。api
字符I/O的單位一般比單個字符大,一個常見的單位是行:一串字符,末尾有一個行終止符,行終止符能夠是回車/換行序列(「\r\n
」),單個回車符(「\r
」)或單個換行符(「\n
」),支持全部可能的行終止符容許程序讀取在任何普遍使用的操做系統上建立的文本文件。oracle
讓咱們修改CopyCharacters
示例以使用面向行的I/O,爲此,咱們必須使用兩個咱們之前從未見過的類,BufferedReader和PrintWriter。編碼
CopyLines示例調用BufferedReader.readLine
和PrintWriter.println
來一次輸入和輸出一行。操作系統
import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class CopyLines { public static void main(String[] args) throws IOException { BufferedReader inputStream = null; PrintWriter outputStream = null; try { inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); String l; while ((l = inputStream.readLine()) != null) { outputStream.println(l); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } }
調用readLine
會返回一行文本,CopyLines
使用println
輸出每一行,println
附加當前操做系統的行終止符,這可能與輸入文件中使用的行終止符不一樣。
有許多方法能夠在字符和行以外構建文本輸入和輸出,有關更多信息,請參閱掃描和格式化。