Java的簡單理解(22)---處理流

weixin_34402408發表於2018-06-25
3532835-93b18ce3b780a64a
Java

處理流

  • 節點流和處理流的關係
  • 節點流處於IO操作的第一線,所有操作必須通過它們進行
  • 處理流可以對其他流進行處理(提高效率和操作靈活性)

1.位元組緩衝流

BufferedInputStream
BufferedOutputStream

public void fileCopy01() {
    // 1.原始檔
    File file1 = new File("E:/xp/test/demo1.txt");
    File file2 = new File("E:/xp/test/demo2.txt");

    // 2.選擇流
    try {
        InputStream is = new BufferedInputStream(new FileInputStream(file1));
        OutputStream os = new BufferedOutputStream(new FileOutputStream(file2));

        byte[] car = new byte[1024];
        int len = 0;

        while ((len = is.read(car)) != -1) {
            os.write(car,0,len);
        }
        os.flush();
        os.close();
        is.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

2.字元緩衝流

BufferedReader
BufferedWriter
新方法:
readLine() 讀取一行
newLine() 換行

public void fileCopy02() {
    // 1. 原始檔
    File file01 = new File("E:/xp/test/demo1.txt");
    File file02 = new File("E:/xp/test/demo2.txt");

    // 2.選擇流(有新方法,就不要使用多型)
    try {
        BufferedReader reader = new BufferedReader(new FileReader(file01));
        BufferedWriter writer = new BufferedWriter(new FileWriter(file02));

        String line = null;

        while ((line = reader.readLine()) != null) {
            writer.write(line);
            writer.newLine(); // 換行
        }

        writer.flush();
        writer.close();
        reader.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 轉換流:位元組流轉為字元流 處理亂碼(編碼集,解碼集)

編碼與解碼都是以程式為中心來說的

1. 編碼與解碼概念
  • 編碼:字元--->編碼字符集--->二進位制
  • 解碼:二進位制--->解碼字符集--->字元
2. 亂碼
    1. 編碼與解碼的字符集不統一
    1. 位元組缺少,長度丟失
3. 檔案亂碼
/**
 * 編碼與解碼字符集不統一導致亂碼
 * @throws UnsupportedEncodingException
 */
public void test() throws UnsupportedEncodingException {

    // 編碼: char ---> byte
    String str = "中國";
    // 解碼: byte ---> char
    byte[] data = str.getBytes();
    // 編碼與解碼字符集統一
    System.out.println(new String(data));

    // 設定編碼字符集
    data = str.getBytes("utf-8");
    // 不統一,出現亂碼
    System.out.println(new String(data));

    // 編碼
    byte[] data2 = str.getBytes("utf-8");
    // 解碼
    str = new String(data2,"utf-8");
    // 編碼和解碼統一
    System.out.println(str);
}
/**
 * 位元組數不完整 導致的亂碼
 */
public void test() {
    String str = "中國";
    byte[] data = str.getBytes();
    // 位元組數不完整 導致的亂碼
    System.out.println(new String(data,0,3));
}

轉換流

InputStreamReader 讀取位元組流轉換為字元流
OutputStreamWriter

    public void test() {

        try {
            // 1. 原始檔
            File file = new File("E:/xp/test/Demo1.java");
            // 2. 位元組流
            FileInputStream fileInputStream = new FileInputStream(file);
            // 3. InputStreamReader是位元組流到字元流的橋樑,並使用指定的charset將其解碼為字元
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
            // 4. BufferedReader從字元輸入流中讀取文字,緩衝字元,以提供字元,陣列和行的高效讀取
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 1. 輸出原始檔
            File file1 = new File("E:/xp/test/Demo2.java");
            // 2. 位元組輸出流
            OutputStream outputStream = new FileOutputStream(file1);
            // 3. 位元組流轉換為字元流
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"utf-8");
            // 4. 位元組緩衝流
            BufferedWriter writer = new BufferedWriter(outputStreamWriter);

            String info = null;
            while ((info = bufferedReader.readLine()) != null) {
                System.out.println(info);
                writer.write(info);
            }
            bufferedReader.close();
            bufferedWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

相關文章