Java-IO流之轉換流的使用和編碼與解碼原理
阿新 • • 發佈:2017-11-27
鍵盤輸入 tostring delet 特點 rgb utf8 equals pri 數據
一、理論:
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。
Java-IO流之轉換流的使用和編碼與解碼原理