1. 程式人生 > 實用技巧 >轉換流

轉換流

轉換流

概念

轉換流是處理流的一種

轉化流提供了在位元組流和字元流之間的轉換

轉換流分類

  • InputStreamReader:將一個位元組的輸入流轉換為字元的輸入流
  • OutputStreamWriter:將一個字元的輸出流轉換為位元組的輸出流

字符集

  • ASCII: 美國標準資訊交換碼,用一個位元組的7位可以表示
  • ISO8859-1: 拉丁碼錶、歐洲碼錶,用一個位元組的8位表示
  • GB2312: 中國的中文編碼表,最多兩個位元組編碼
  • GBK: 中國的中文編碼表升級,融合了更多的中文文字元號,最多兩個位元組編碼
  • Unicode: 國際標準碼,融合了目前人類使用的所有字元,為每一個字元分配唯一的字元碼,所有的文字都用兩個位元組來表示
  • UTF-8: 變長的編碼方式,可用1-4個位元組來表示字元

使用

InputStreamReader

  • 實現將位元組的輸入流按指定字符集轉換為字元的輸入流。
  • 需要和InputStream“套接”

利用到的構造器

InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);

引數二指明瞭字符集,具體使用哪種字符集取決於檔案儲存時使用的字符集

舉例:

InputStreamReader isr = new InputStreamReader(fis);//使用系統預設的字符集

InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//使用UTF-8字符集

OutputStreamWriter

  • 實現將字元的輸出流按指定字符集轉換為位元組的輸出流。
  • 需要和OutputStream“套接”

利用到的構造器

public OutputStreamWriter(OutputStream out, String charsetName)

舉例

osw = new OutputStreamWriter(fos,"gbk");

程式碼實現

InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
    File file1 = new File("hello.txt");
    File file2 = new File("hi.txt");

    FileInputStream fis = new FileInputStream(file1);
    FileOutputStream fos = new FileOutputStream(file2);

    isr = new InputStreamReader(fis,"UTF-8");
    osw = new OutputStreamWriter(fos,"gbk");

    char[] cbuf = new char[20];
    int len;
    while((len = isr.read(cbuf)) != -1){
        osw.write(cbuf,0,len);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if(isr != null)
            isr.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        if(osw != null)
            osw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}