1. 程式人生 > >Java IO之處理流(緩衝流、轉換流)

Java IO之處理流(緩衝流、轉換流)

一、處理流:

增強功能,提供效能,在節點流之上。

二、節點流與處理流的關係

節點流(位元組流、字元流)處於IO操作的第一線,所有操作必須通過它們進行;
處理流可以對其他流進行處理(提高效率或操作靈活性)。

三、緩衝流

1、位元組緩衝流

BufferedInputStream
BufferedOutputStream
package IOBuffer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import
java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * 處理流(位元組緩衝流) * 位元組流檔案拷貝+緩衝流,提高效能 * 緩衝流(節點流) */ @SuppressWarnings("all") public class Demo01 { public static void main(String[] args) { String srcPath = "G:/1314.jpg"; String destPath = "G:/try/520.jpg"
; try { copyFile(srcPath,destPath); } catch (IOException e) { e.printStackTrace(); } } public static void copyFile(String srcPath,String destPath) throws IOException { //1、建立聯絡 源存在(且為檔案)+目的地(檔案可以不存在) File src = new
File(srcPath); File dest = new File(destPath); if(!src.isFile()) { System.out.println("只能拷貝檔案"); throw new IOException("只能拷貝檔案"); } //2、選擇流 緩衝流(位元組輸入流) InputStream is = new BufferedInputStream(new FileInputStream(src)); OutputStream os =new BufferedOutputStream(new FileOutputStream(dest)) ; //3、檔案拷貝 迴圈+讀取+寫出 byte[] flush = new byte[1024]; int len = 0; while(-1!=(len = is.read(flush))) { //寫出 os.write(flush,0,len); } os.flush();//強制刷出 //關閉流 先開啟後關閉 os.close(); is.close(); } }

2、字元緩衝流

BufferedReader  新增readLine()讀取一個文字行。 
BufferedWriter  新增newLine()寫入一個行分隔符。
package IOBuffer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 
 * 字元緩衝流+新增方法(不能發生多型)
 */

public class Demo02 {
    public static void main(String[] args) {
        String srcPath = "G:/oo.txt";
        String destPath = "G:/xx.txt";      
        //建立源
        File src = new File(srcPath);
        File dest = new File(destPath);

        //選擇流   緩衝流   如果後面要使用新增方法,就不能使用多型了。
        //如果沒有使用子類的新增方法,可以使用多型方式。
        /*Reader reader = null;
        Writer writer = null;
        reader =new BufferedReader(new FileReader(src)) ;
        writer = new BufferedWriter(new FileWriter(dest));
        reader.read(flush)
        writer.write(flush,0,len)*/     
        BufferedReader reader = null;
        BufferedWriter writer = null;

        try {
            reader =new BufferedReader(new FileReader(src)) ;
            writer = new BufferedWriter(new FileWriter(dest));
            //讀取操作
            //新增方法操作的字元緩衝流
            String line = null;//一行一行讀取 BufferedReader新增readLine()
            while(null!=(line = reader.readLine()))
            {
                writer.write(line);
                //writer.append("\r\n");//換行符
                writer.newLine();//換行符  新增方法
            }
            writer.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("檔案不存在");
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally
        {
            if(null!=reader)
            {
                try {
                    writer.close();
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }       
    }
}

四、轉換流

(一)位元組流轉換為字元流,處理亂碼(編碼集、解碼集)
解碼:二進位制–>解碼字符集–>字元
編碼:字元–>編碼字符集–>二進位制

(二)為什麼會出現亂碼?
1、解碼與編碼的字符集不統一
2、位元組缺少,長度丟失

(三)檔案亂碼(通過轉換流進行處理)

package IOConver;

import java.io.UnsupportedEncodingException;

public class Demo01 {
    public static void main(String[] args) {

        test01();
        System.out.println("-----------");
        test02();
    }

    //解碼與編碼字符集字符集必須相同
    public static  void test01()
    {
        //解碼byte-->char
        String str = "中國";//UTF-8
        //編碼 char-->byte
        byte[] data = str.getBytes();
        //編碼與解碼的字符集統一
        System.out.println(new String(data));


        try {
            data  = str.getBytes("gbk");//設定編碼字符集    編碼
            //不統一字符集,出現亂碼
            System.out.println(new String(data));//解碼
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        byte[] data2;
        try {
            //編碼
            data2 = "中國".getBytes("GBK");
            //解碼
            str = new String(data2,"GBK");
            //str = new String(data2);//不指定 預設解碼UTF-8 會出現亂碼
            System.out.println(new String(str));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }               
    }
    //位元組缺少,長度丟失
    public static  void test02(){
        String str = "中國";
        byte[] data;
        data = str.getBytes();//編碼
        //位元組數不完整
        System.out.println(new String(data,0,4));

    }
}

執行結果:

�й�
中國
-----------
中�
package IOConver;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 轉換流:位元組轉為字元
 * 1、輸出流OutputStreamWriter  編碼
 * 2、輸入流InputStreamReader  解碼
 */
public class Demo02 {
    public static void main(String[] args) throws IOException {
        //輸入檔案  解碼 (位元組到字元)   讀取  要顯示  
        //指定解碼字符集    BufferedReader字元流--InputStreamReader轉換流--FileInputStream位元組流
        BufferedReader br = new BufferedReader
                (
                    new InputStreamReader
                    (
                        new FileInputStream(new File("g:/writer.txt")),"UTF-8"
                    )
                );//指定字元解碼集

        //寫出檔案     編碼(字元到位元組)
        BufferedWriter bw = new BufferedWriter
                (
                    new OutputStreamWriter
                    (
                        new FileOutputStream(new File("G:/try/abdec.txt")),"UTF-8"
                    )
                );

        String info = null;
        while(null!=(info = br.readLine()))
        {
            System.out.println(info);
            bw.write(info+"\r\n");
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

執行結果:

每個人都有青春,
每個青春都有一個故事,
每個故事都有一個遺憾,
每個遺憾卻都存在著他的美好。ouye

五、常用流關係圖