自定義彈窗
轉換流
字元編碼:
編碼:按照某種規則,將字元儲存到計算機中(字元->二進位制);
解碼:將儲存在計算機中的二進位制資料按某種規則解析出來(二進位制->字元)
字元編碼:一套自然語言的字元與二進位制之間的規則
字符集:是一個系統支援所有字元的集合,包括各個國家的文字、標點符號、圖形符號和 數字等;
常見的編碼表和字符集對應關係
1.ASCII編碼表——ASCII字符集
2.GBK編碼表——GBK字符集
3.UTF—8編碼表,UTF—16編碼表,UTF—32編碼表 (UTF—8編碼表最為常用)
三個編碼表對應的都是Unicode字符集
(不同的字符采用不同的位元組,
在UTF—8中,123個ASCII字元只需要一個位元組編碼,拉丁文等字元需要兩個位元組編碼,大部分常用字如中文用3個位元組編碼,其他極少使用的字元使用四位元組編碼)
編碼產生的問題:
FileReader可以讀取IDE預設格式(UTF—8)的檔案,當讀取系統預設編碼(GBK)時會產生亂碼,使用轉換流可解決該問題。
1.OutputStreamWriter
是字元流通向子節流的橋樑可用指定編碼表將要寫入的資料編碼成位元組
方法:write、flush、close
構造方法:
OutputStreamWriter(OutputStream out)
使用預設編碼表;
OutputStreamWriter(OutputStream out , String charsetName)
建立指定編碼表;
引數:out:位元組輸出流,可以寫轉換之後的位元組到檔案中
charsetName:指定編碼表名稱,不區分大小寫
使用步驟:
1.建立物件,在構造方法中傳遞位元組輸出流和指定編碼表
2.使用write方法,把字元轉化為位元組儲存到緩衝區中(編碼)
3.使用flush方法,把記憶體緩衝區資料重新整理到檔案
4.釋放資源
2.InputStreamReader
是位元組流通向子符流的橋樑可用指定編碼表讀取位元組並將其解碼為字元
方法:read、close
構造方法:
InputStreamReader(InputStream in)
使用預設編碼表;
InputStreamReader(InputStream in , String charsetName)
建立指定編碼表;
引數:out:位元組輸出流,可以寫轉換之後的位元組到檔案中
charsetName:指定編碼表名稱,不區分大小寫
使用步驟:
1.建立物件,在構造方法中傳遞位元組輸入流和指定編碼表
2.使用read方法,讀取檔案
3.釋放資源
程式碼練習
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class DemoTransform04 { public DemoTransform04() { } public static void main(String[] args) throws IOException { read_gbk("Month\\src\\LearnIO2\\obj.txt"); } //使用GBK編碼表寫入檔案資料 public static void write_gbk(String pathnanme) throws IOException { File file = new File(pathnanme); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk"); osw.write("空山新雨後,天氣晚來秋"); osw.flush(); osw.close(); } //讀一個GBK編碼表的檔案 public static void read_gbk(String pathname) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream(pathname), "gbk"); char[] chars = new char[11]; boolean var3 = false; while(isr.read(chars) != -1) { System.out.println(chars); } isr.close(); } //使用UTF-8編碼表寫入檔案資料 public static void write_utf_8(String pathnanme) throws IOException { File file = new File(pathnanme); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); osw.write("空山新雨後,天氣晚來秋"); osw.flush(); osw.close(); } }