1.9 Java转换流:InputStreamReader和OutputStreamWriter
正常情況下,字節流可以對所有的數據進行操作,但是有些時候在處理一些文本時我們要用到字符流,比如,查看文本的中文時就是需要采用字符流更為方便。所以 Java IO 流中提供了兩種用于將字節流轉換為字符流的轉換流。
InputStreamReader 用于將字節輸入流轉換為字符輸入流,
OutputStreamWriter 用于將字節輸出流轉換為字符輸出流。使用轉換流可以在一定程度上避免亂碼,還可以指定輸入輸出所使用的字符集。
例 1
在 java.txt 中輸出“一曲相思”,將 java.txt 保存為“UTF-8”的格式,然后通過字節流的方式讀取,代碼如下:
輸出結果為中文都是亂碼。下面用字節數組,并通過字符串設定編碼格式來顯式內容,代碼如下:
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();}}}這時輸出結果中文,但是當存儲的文字較多時,會出現解碼不正確的問題,且字節長度無法根據解碼內容自動設定,此時就需要轉換流來完成。代碼如下:
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
下面以獲取鍵盤輸入為例來介紹轉換流的用法。Java 使用 System.in 代表標準輸出,即鍵盤輸入,但這個標準輸入流是 InputStream 類的實例,使用不太方便,而且鍵盤輸入內容都是文本內容,所以可以使用 InputStreamReader 將其轉換成字符輸入流,普通的 Reader 讀取輸入內容時依然不太方便,可以將普通的 Reader 再次包裝成 BufferedReader,利用 BufferedReader 的 readLine() 方法可以一次讀取一行內容。程序如下所示。
上面代碼第 4 行和第 6 行將 System.in 包裝成 BufferedReader,BufferReader 流具有緩沖功能,它可以一次讀取一行文本,以換行符為標志,如果它沒有讀到換行符,則程序堵塞,等到讀到換行符為止。運行上面程序可以發現這個特征,在控制臺執行輸入時,只有按下回車鍵,程序才會打印出剛剛輸入的內容。
流口水 輸入內容:流口水由于 BufferedReader 具有一個 readLine() 方法,可以非常方便地進行一次讀入一行內容,所以經常把讀入文本內容地輸入流包裝成 BufferedReader,用來方便地讀取輸入流的文本內容。
學到這里,大家可能有一個疑問:既然有字節流轉字符流的轉換流,那么為什么沒有字符流轉字節流的轉換流呢?
這個問題一語指出了 Java 設計的遺漏之處,想一想字符流和字節流的差別。字節流比字符流的使用范圍要更廣,但字符流比字節流操作方便。如果有一個流已經是字符流了,也就是說,是一個用起來更方便的流,為什么要轉換成字節流呢?反之,如果現在有一個字節流,但可以確定這個字節流的內容都是文本內容,那么把它轉換成字符流來處理就會更方便一些,所以 Java 只提供了將字節流轉換成字符流的轉換流,沒有提供將字符流轉換成字節流的轉換流。
總結
以上是生活随笔為你收集整理的1.9 Java转换流:InputStreamReader和OutputStreamWriter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.8 Java字节流和字符流的区别,如
- 下一篇: java美元兑换,(Java实现) 美元