day36-IO流03

2022-09-12 06:01:22

JavaIO流03

4.常用的類02

4.4節點流和處理流

4.4.1基本介紹

  1. 節點流可以從一個特定的資料來源讀寫資料,如FileReader、FileWriter

    資料來源就是存放資料的地方,比如檔案、陣列、字串、管道等

  1. 處理流(也叫包裝流)是「連線」在已經存在的流(節點流或者處理流)之上,為程式提供更為強大的讀寫功能,也更加靈活,如BufferedReader、BufferedWriter

  • 節點流和處理流的區別和聯絡:
  1. 節點流是底層流(低階流),直接和資料來源相連線。
  2. 處理流(包裝流)對節點流進行了包裝,既可以消除不同節點流的實現差異,也可以提供更方便的方法來完成輸入輸出。
  3. 處理流對節點流進行了包裝,使用了修飾器的設計模式,不會直接與資料來源相連線。

  • 處理流特點:

    1.效能的提高:主要以增加緩衝的方式來提高輸入輸出的效率。

    2.操作的便捷:處理流提供了一系列便捷的方法來一次輸入輸出大批次的資料,使用更加靈活方便。

4.4.2模擬包裝流-修飾器模式

Reader_:

package li.io;

/**
 * 模擬包裝流的修飾器模式
 */
public abstract class Reader_ {//抽象類
    public void readFile() {}
    public void readString() {}
}

FileReader_:

package li.io;

public class FileReader_ extends Reader_ {//模擬節點流

    public void readFile() {
        System.out.println("對檔案進行讀取...");
    }
}

StringReader_:

package li.io;

public class StringReader_ extends Reader_ {//模擬節點流

    public void readString() {
        System.out.println("讀取字串...");
    }
}

BufferedReader_:

package li.io;

/**
 * 模擬處理流(包裝流)
 */
public class BufferedReader_ extends Reader_ {
    private Reader_ reader_;//屬性是Reader_型別

    public BufferedReader_(Reader_ reader_) {
        this.reader_ = reader_;
    }

    public void readFile(){//封裝一層
        reader_.readFile();
    }

    //讓方法更加靈活,比如多次讀取檔案,或者加緩衝byte[]...
    public void readFile(int num) {
        for (int i = 0; i < num; i++) {
            reader_.readFile();
        }
    }

    //又如擴充套件readString方法,例如批次處理字串資料...
    public void readString(int num) {
        for (int i = 0; i < num; i++) {
            reader_.readString();
        }
    }
}

Test_:

package li.io;

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

        BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
        bufferedReader_.readFile(3);
        bufferedReader_.readFile();

        BufferedReader_ bufferedReader02_ = new BufferedReader_(new StringReader_());
        bufferedReader02_.readString(2);
    }
}

注意:位元組流可以操作二進位制檔案,同時也可以操作文字檔案