1. 程式人生 > >75. InputStreamReader和OutputStreamWriter(轉換流--字節流轉換成字符流)

75. InputStreamReader和OutputStreamWriter(轉換流--字節流轉換成字符流)

AR 新建 oid file 謝謝 color 解碼 class line

轉換流:

InputStreamReader 輸入字節流轉換成輸入字符流
OutputStreamWriter 輸出字節流轉換成輸出字符流

總結:就是字節流轉換成字符流,但是不能字節流轉換成字節流(聯想記憶----只有屌絲想變成高富帥,沒有高富帥想變成屌絲)

應用場景:
在以後開發中中我們免不了使用別人的工具,如果別人就是返回一個字節流,但是你想用字符流,這個時候我們就可以使用轉換流來把字節流轉換成字符流

下面是一些實例演示:

把字節流轉換成字符流,並實現讀寫

public class Demo3 {
    public static void main(String[] args) throws
IOException { writeText(); readText(); } public static void readText() throws IOException { File file = new File("D:\\新建文件夾\\a.txt"); FileInputStream fileInputStream = new FileInputStream(file); //輸入字節流轉換成輸入字符流 InputStreamReader inputStreamReader = new
InputStreamReader(fileInputStream); char[] cs = new char[1024]; int length = 0; while((length = inputStreamReader.read(cs))!=-1) { System.out.println(new String(cs,0,length)); } inputStreamReader.close(); } public static void writeText() throws
IOException { File file = new File("D:\\新建文件夾\\a.txt"); FileOutputStream fileOutputStream = new FileOutputStream(file); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); outputStreamWriter.write("你好,陌生人"); outputStreamWriter.close(); } }

技術分享圖片

字節流轉換成字符流後用字符流的緩存類實現讀寫

public class Demo4 {
    public static void main(String[] args) throws IOException {
        readText();
        writeText();
    }
    
    public static void readText() throws IOException {
        File file = new File("D:\\新建文件夾\\a.txt");
        FileOutputStream fileInputStream = new FileOutputStream(file);
        //輸出字節流轉換成輸入字符流
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileInputStream);
        //使用輸出字符流的緩存類
        BufferedWriter bufferedReader = new BufferedWriter(outputStreamWriter);
        //一行一行存
        bufferedReader.write("這是第一行數據");
        bufferedReader.newLine();
        bufferedReader.write("這是第二行數據");
        
        bufferedReader.close();
        
    }
    
    public static void writeText() throws IOException {
        File file = new File("D:\\新建文件夾\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        //輸入字節流轉換成輸入字符流
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
        //使用輸入字符流的緩存類
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String line = null;
        //一行一行讀取文本
        while((line = bufferedReader.readLine())!=null) {
            System.out.println(line);
        }
        bufferedReader.close();
    }
}

技術分享圖片

把字節流轉換成字符流並指定碼表進行讀寫數據

註意:記事本值存儲和我們從記事本獲取數據的都是碼值,並不是我們輸入時的字符,只不過我們在打開記事本的時候記事本自動給我們解碼了,也就是我們看的懂得字符,上面我們沒有指定碼表,實際上是讀寫時使用的是默認的編碼表gbk(java中默認碼表)

public class Demo5 {
    public static void main(String[] args) throws IOException {
        writeText();
        readText();
    }
    
    public static void writeText() throws IOException {
        File file = new File("D:\\新建文件夾\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "iso8859-1");
        outputStreamWriter.write("你好!!!");
        outputStreamWriter.close();
    }
    
    public static void readText() throws IOException {
        File file = new File("D:\\新建文件夾\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");
        char[] cs = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(cs))!=-1) {
            System.out.println(new String(cs,0,length));
        }
        inputStreamReader.close();
    }
}

技術分享圖片

在這個之前我實驗四種碼表(iso8859-1 gbk utf-8 utf-16),發現除了用iso8859-1碼表寫入記事本,其他的碼表編碼,記事本都可以解碼成功(我們看的懂得文字),至於為什麽我不知道可能跟我們系統有關(猜測),我們再來分析為什麽會輸出這麽個鬼東西出來

首先我在存入“你好!!!”的時候,我是使用的iso8859-1碼表編碼的,註意這裏我們編譯的是中國文字,在iso8859-1碼表中是中國文字是沒有對應的碼值的,所以會出現亂碼,並且每一個字符都是一樣的(全是?),也就是對於不能識別的字符都是給的63這個碼值(下面例子可以知道),所以導致最後我們根據這個碼值進行解碼的時候控制臺全輸出的是?

在上一片中最後一個例子中,跟這個是不同的,那個例子中首先是使用gbk先進行編碼成對應的碼值,而這個碼值在iso8859-1碼表中都有對應的字符(iso8859-1碼表的特性),最後我們才可以獲取最早用gbk編碼的後的碼值後找到原來的字符,而這個是一開始就是用iso8859-1碼表進行的編碼,並且iso8859-1碼表對於不能識別的字符都是給的63這個碼值,這個是解碼不出最初的字符的(如果有大神知道可以私信我,謝謝)

public static void readText() throws IOException {
        File file = new File("D:\\新建文件夾\\a.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");
        char[] cs = new char[1024];
        int length = 0;
        while((length = inputStreamReader.read(cs))!=-1) {
            String str = new String(cs,0,length);
            byte[] buf = str.getBytes("iso8859-1");
            System.out.println(Arrays.toString(buf));
        }
        inputStreamReader.close();
    }

技術分享圖片

75. InputStreamReader和OutputStreamWriter(轉換流--字節流轉換成字符流)