Java-IO流之轉換流的使用和編碼與解碼原理


一、理論:

1、字符流和字節流區別是什么?

字符流=字節流+編碼集,在實際讀取的時候其實字符流還是按照字節來讀取,但是會更具編碼集進行查找編碼集字典解析相應的字節,使得一次讀取出一個字符;

2、什么是轉換流?

轉換流就是原本是字節流,但是讀取到的數據是字符,所以我們希望使用字符流來進行操作,那么就可以使用轉換流進行轉換;

轉換流=字節流+編碼集。

轉換流的特點是可以指定編碼集。

3、轉換流的作用:

(1)、從控制台讀取數據輸入(鍵盤輸入),將它們寫入到文件(我們寫的是字符吧);

(2)、當對文件進行解析的時候,如果涉及編碼,就需要使用轉換流進行解碼--------亂碼可不好玩。

二、實戰:

1、從鍵盤輸入的文本保存到文件:

        try (InputStreamReader inReader = new InputStreamReader(System.in)) {
            StringBuilder sb = new StringBuilder();

            int ch;
            try (OutputStream out = new FileOutputStream("console.txt")) {
                while ((ch = inReader.read()) != -1) {
                    if ((char) ch == '\r')
                        continue;

                    if ((char) ch == '\n') {
                        System.out.println(sb.toString().toUpperCase());
                        out.write(sb.toString().getBytes());
                        sb.delete(0, sb.length());
                        continue;
                    }

                    sb.append((char) ch);
                    if (sb.toString().equals("esc"))
                        break;
                }
            }

        }

  1)、我們經常使用的System.out.println就是輸入流,自然,和它相對應的就是輸入流,輸入者是鍵盤,輸出的對象是到控制台;

 

2、編碼和解碼:

        try (BufferedReader inReaderGBK = new BufferedReader(new InputStreamReader(new FileInputStream("gbk.txt"), "gbk"))) {

            try (BufferedWriter outWriterUTF8 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("人類簡史.txt"), "utf-8"))) {

                int ch;
                while ((ch = inReaderGBK.read()) != -1) {
                    outWriterUTF8.write(ch);
                }

            }
        }

在上面的代碼中,"gbk.txt"  文件是使用GBK編碼,而 "人類簡史.txt" 文件是使用utf-8;我們使用轉換流把gbk編碼格式的文件轉換成了utf-8編碼格式的文件。原理如下:

1、讀取 "gbk.txt" 的時候,先讀取的是字節,然后根據我們指定的編碼集去查找字典,因此可以讀取出正確的字符;

2、而在寫入 "人類簡史.txt" 文件的時候,字符先是經過了轉換流,轉換流接收到了字符,看了一下自己被指定為utf-8格式的,所以就去查編碼集,把接收到的字符轉換成了utf-8編碼的格式,然后寫入了文件;

3、over。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM