字符流
Java平臺使用Unicode約定存儲字符值,字符流I/O自動將此內(nèi)部格式與本地字符集進行轉(zhuǎn)換,在Western語言環(huán)境中,本地字符集通常是ASCII的8位超集。
對于大多數(shù)應用程序,具有字符流的I/O并不比具有字節(jié)流的I/O復雜,使用流類完成的輸入和輸出會自動轉(zhuǎn)換為本地字符集和從本地字符集轉(zhuǎn)換,使用字符流代替字節(jié)流的程序會自動適應本地字符集并為國際化做了準備 — 所有這些都無需程序員的額外努力。
如果國際化不是優(yōu)先事項,你可以簡單地使用字符流類,而不必過多關(guān)注字符集問題,之后,如果國際化成為優(yōu)先事項,你的程序可以進行調(diào)整而無需進行大量重新編碼。
使用字符流所有字符流類都派生自Reader和Writer,與字節(jié)流一樣,有專門用于文件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非常相似,最重要的區(qū)別是CopyCharacters使用FileReader和FileWriter代替FileInputStream和FileOutputStream進行輸入和輸出。請注意,CopyBytes和CopyCharacters都使用int變量來讀取和寫入,但是,在CopyCharacters中,int變量在其最后16位中保存一個字符值,在CopyBytes中,int變量在其最后8位中保存一個字節(jié)值。
使用字節(jié)流的字符流字符流通常是字節(jié)流的“包裝器”,字符流使用字節(jié)流來執(zhí)行物理I/O,而字符流處理字符和字節(jié)之間的轉(zhuǎn)換,例如,FileReader使用FileInputStream,而FileWriter使用FileOutputStream。
有兩種通用的字節(jié)到字符“橋接”流:InputStreamReader和OutputStreamWriter,當沒有符合你需求的預打包字符流類時,使用它們來創(chuàng)建字符流。
面向行的I/O字符I/O的單位通常比單個字符大,一個常見的單位是行:一串字符,末尾有一個行終止符,行終止符可以是回車/換行序列(“ ”),單個回車符(“ ”)或單個換行符(“ ”),支持所有可能的行終止符允許程序讀取在任何廣泛使用的操作系統(tǒng)上創(chuàng)建的文本文件。
讓我們修改CopyCharacters示例以使用面向行的I/O,為此,我們必須使用兩個我們以前從未見過的類,BufferedReader和PrintWriter。
CopyLines示例調(diào)用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(); } } } }
調(diào)用readLine會返回一行文本,CopyLines使用println輸出每一行,println附加當前操作系統(tǒng)的行終止符,這可能與輸入文件中使用的行終止符不同。
有許多方法可以在字符和行之外構(gòu)建文本輸入和輸出,有關(guān)更多信息,請參閱掃描和格式化。
上一篇:字節(jié)流 下一篇:緩沖流文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72967.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續(xù)版本中引入的改進。 Java教程是希望使用Java編程語言創(chuàng)建應用程序的程序員的實用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...
命令行I/O 程序通常從命令行運行,并在命令行環(huán)境中與用戶交互,Java平臺以兩種方式支持這種交互:通過標準流和控制臺。 標準流 標準流是許多操作系統(tǒng)的一個特性,默認情況下,它們從鍵盤讀取輸入并將輸出寫入顯示器,它們還支持文件和程序之間的I/O,但該功能由命令行解釋器控制,而不是程序。 Java平臺支持三種標準流:標準輸入,可通過System.in訪問;標準輸出,可通過System.out訪問;和...
格式化流 實現(xiàn)格式化的流對象是PrintWriter(字符流類)或PrintStream(字節(jié)流類)的實例。 你可能需要的唯一PrintStream對象是System.out和System.err(有關(guān)這些對象的更多信息,請參閱命令行中的I/O),當你需要創(chuàng)建格式化的輸出流時,請實例化PrintWriter,而不是PrintStream。 與所有字節(jié)和字符流對象一樣,PrintStream和Pri...
字節(jié)流 程序使用字節(jié)流來執(zhí)行8位字節(jié)的輸入和輸出,所有的字節(jié)流類都是從InputStream和OutputStream派生出來的。 有許多字節(jié)流類,為了演示字節(jié)流的工作原理,我們將重點關(guān)注文件I/O字節(jié)流,F(xiàn)ileInputStream和FileOutputStream,其他類型的字節(jié)流以大致相同的方式使用,它們的不同之處主要在于它們的構(gòu)造方式。 使用字節(jié)流 我們將通過檢查名為CopyBytes的...
緩沖流 到目前為止,我們看到的大多數(shù)示例都使用無緩沖的I/O,這意味著每個讀取或?qū)懭胝埱蠖加傻讓硬僮飨到y(tǒng)直接處理,這可以使程序效率低得多,因為每個這樣的請求通常觸發(fā)磁盤訪問、網(wǎng)絡活動或一些相對昂貴的其他操作。 為了減少這種開銷,Java平臺實現(xiàn)了緩沖的I/O流,緩沖輸入流從稱為緩沖區(qū)的內(nèi)存區(qū)讀取數(shù)據(jù),僅當緩沖區(qū)為空時才調(diào)用原生輸入API,類似地,緩沖輸出流將數(shù)據(jù)寫入緩沖區(qū),并且僅在緩沖區(qū)已滿時才調(diào)...
閱讀 1581·2023-04-26 02:50
閱讀 3581·2023-04-26 00:28
閱讀 1962·2023-04-25 15:18
閱讀 3246·2021-11-24 10:31
閱讀 1029·2019-08-30 13:00
閱讀 1028·2019-08-29 15:19
閱讀 1801·2019-08-29 13:09
閱讀 3008·2019-08-29 13:06