1.9 Java转换流:InputStreamReader和OutputStreamWriter
正常情況下,字節(jié)流可以對(duì)所有的數(shù)據(jù)進(jìn)行操作,但是有些時(shí)候在處理一些文本時(shí)我們要用到字符流,比如,查看文本的中文時(shí)就是需要采用字符流更為方便。所以 Java IO 流中提供了兩種用于將字節(jié)流轉(zhuǎn)換為字符流的轉(zhuǎn)換流。
InputStreamReader 用于將字節(jié)輸入流轉(zhuǎn)換為字符輸入流,
OutputStreamWriter 用于將字節(jié)輸出流轉(zhuǎn)換為字符輸出流。使用轉(zhuǎn)換流可以在一定程度上避免亂碼,還可以指定輸入輸出所使用的字符集。
例 1
在 java.txt 中輸出“一曲相思”,將 java.txt 保存為“UTF-8”的格式,然后通過字節(jié)流的方式讀取,代碼如下:
輸出結(jié)果為中文都是亂碼。下面用字節(jié)數(shù)組,并通過字符串設(shè)定編碼格式來顯式內(nèi)容,代碼如下:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;public class Test {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("I://work.txt");byte b[] = new byte[1024];int len = 0;while ((len = fis.read(b)) != -1) {System.out.print(new String(b, 0, len, "GBK"));}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}這時(shí)輸出結(jié)果中文,但是當(dāng)存儲(chǔ)的文字較多時(shí),會(huì)出現(xiàn)解碼不正確的問題,且字節(jié)長(zhǎng)度無法根據(jù)解碼內(nèi)容自動(dòng)設(shè)定,此時(shí)就需要轉(zhuǎn)換流來完成。代碼如下:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader;public class Test {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("I://work.txt");InputStreamReader isr=new InputStreamReader(fis,"GBK");int b=0;while ((b = isr.read()) != -1) {System.out.print((char)b);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}例 2
下面以獲取鍵盤輸入為例來介紹轉(zhuǎn)換流的用法。Java 使用 System.in 代表標(biāo)準(zhǔn)輸出,即鍵盤輸入,但這個(gè)標(biāo)準(zhǔn)輸入流是 InputStream 類的實(shí)例,使用不太方便,而且鍵盤輸入內(nèi)容都是文本內(nèi)容,所以可以使用 InputStreamReader 將其轉(zhuǎn)換成字符輸入流,普通的 Reader 讀取輸入內(nèi)容時(shí)依然不太方便,可以將普通的 Reader 再次包裝成 BufferedReader,利用 BufferedReader 的 readLine() 方法可以一次讀取一行內(nèi)容。程序如下所示。
上面代碼第 4 行和第 6 行將 System.in 包裝成 BufferedReader,BufferReader 流具有緩沖功能,它可以一次讀取一行文本,以換行符為標(biāo)志,如果它沒有讀到換行符,則程序堵塞,等到讀到換行符為止。運(yùn)行上面程序可以發(fā)現(xiàn)這個(gè)特征,在控制臺(tái)執(zhí)行輸入時(shí),只有按下回車鍵,程序才會(huì)打印出剛剛輸入的內(nèi)容。
流口水 輸入內(nèi)容:流口水由于 BufferedReader 具有一個(gè) readLine() 方法,可以非常方便地進(jìn)行一次讀入一行內(nèi)容,所以經(jīng)常把讀入文本內(nèi)容地輸入流包裝成 BufferedReader,用來方便地讀取輸入流的文本內(nèi)容。
學(xué)到這里,大家可能有一個(gè)疑問:既然有字節(jié)流轉(zhuǎn)字符流的轉(zhuǎn)換流,那么為什么沒有字符流轉(zhuǎn)字節(jié)流的轉(zhuǎn)換流呢?
這個(gè)問題一語指出了 Java 設(shè)計(jì)的遺漏之處,想一想字符流和字節(jié)流的差別。字節(jié)流比字符流的使用范圍要更廣,但字符流比字節(jié)流操作方便。如果有一個(gè)流已經(jīng)是字符流了,也就是說,是一個(gè)用起來更方便的流,為什么要轉(zhuǎn)換成字節(jié)流呢?反之,如果現(xiàn)在有一個(gè)字節(jié)流,但可以確定這個(gè)字節(jié)流的內(nèi)容都是文本內(nèi)容,那么把它轉(zhuǎn)換成字符流來處理就會(huì)更方便一些,所以 Java 只提供了將字節(jié)流轉(zhuǎn)換成字符流的轉(zhuǎn)換流,沒有提供將字符流轉(zhuǎn)換成字節(jié)流的轉(zhuǎn)換流。
總結(jié)
以上是生活随笔為你收集整理的1.9 Java转换流:InputStreamReader和OutputStreamWriter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.8 Java字节流和字符流的区别,如
- 下一篇: 1.10 对象序列化控制输入输出