1. 程式人生 > 其它 >Java 基礎 (IO轉換流)

Java 基礎 (IO轉換流)

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

  • Java API提供了兩個轉換流:
    InputStreamReader : 將 InputStream 轉換為 Reader
    OutputStreamWriter : 將 Writer 轉換為 OutputStream

  • 位元組流中的資料都是字元時,轉成字元流操作更高效。

  • 很多時候我們使用轉換流來處理檔案亂碼問題。實現編碼和解碼的功能。

1. 轉換流: 屬於字元流
InputStreamReader:將一個位元組的輸入流轉換為字元的輸入流OutputStreamWriter:將一個字元的輸出流轉換為位元組的輸出流

2. 作用: 提供位元組流與字元流之間的轉換

3. 解碼: 位元組、位元組陣列 ---> 字元陣列、字串
   編碼: 字元陣列、字串 ---> 位元組、位元組陣列

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

面向傳輸的眾多 UTF (UCS Transfer Format)標準出現了,顧名思義,UTF-8就是每次8個位傳輸資料,而 UTF-16就是每次16個位。這是為傳輸而設計的編碼,並使編碼無國界,這樣就可以顯示全世界上所有文化的字元了。

Unicode 只是定義了一個龐大的、全球通用的字符集,併為每個字元規定了唯一確定的編號,具體儲存成什麼樣的位元組流,取決於字元編碼方案。推薦的 Unicode 編碼是 UTF-8 和 UTF-16。

InputStreamReaderTest.java

package com.klvchen.java;

import org.junit.Test;

import java.io.*;

public class InputStreamReaderTest {

    @Test
    public void test1() throws IOException {
        FileInputStream fis = new FileInputStream("dbcp.txt");
        //InputStreamReader isr = new InputStreamReader(fis); //使用系統預設的字符集
        //引數2指明瞭字符集,具體使用哪個字符集,取決於檔案dbcp.txt儲存時使用的字符集
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");

        char[] cbuf = new char[20];
        int len;
        while ((len = isr.read(cbuf)) != -1) {
            String str = new String(cbuf, 0, len);
            System.out.print(str);
        }

        isr.close();
    }

    @Test
    public void test2() throws IOException {
        //1.造檔案,造流
        File file1 = new File("dbcp.txt");
        File file2 = new File("dbcp_gbk.txt");

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

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

        //2.讀寫過程
        char[] cbuf = new char[20];
        int len;
        while ((len = isr.read(cbuf)) != -1) {
            osw.write(cbuf, 0 ,len);
        }

        //3.關閉資源
        isr.close();
        osw.close();
    }
}