1. 程式人生 > >Stoker的Java學習之裝飾者模式、列印流和合並流

Stoker的Java學習之裝飾者模式、列印流和合並流

Java學習之裝飾者模式、列印流和合並流

一.裝飾者模式( 解耦 不讓類和類產生繼承的關係)

在Java程式設計設計中,對已有物件的功能進行擴充套件。 把通用功能封裝在裝飾器中,用到的地方進行呼叫。 裝飾模式是一種用於替代繼承的技術,使用物件之間的關聯關係取代類之間的繼承關係。引入裝飾類,擴充新功能。對物件原有的功能進行升級。

  • 書寫步驟
  • 1.明確被裝飾的物件。
  • 2.將被裝飾的物件通過構造方法傳入裝飾類, 裝飾類中肯定有一個成員變數 就是被裝飾的物件。
  • 3.擁有被裝飾的物件相當於可以呼叫該物件的所有方法, 就可以對該方法進行升級。
public class SimpleExample {
    public static void main(String[] args) {
        Student student = new Student();
        LxStudent lxStudent = new LxStudent(student);
        lxStudent.study();
    }
}
// 學習的介面
interface Study{
    void study();
}
// 在校學生
class Student implements Study{

    @Override
    public void study() {
        System.out.println("在校學習了 C C++ C#");
        
    }
    
}
//裝飾類
class LxStudent implements Study{
    //將被裝飾者宣告為成員變數
    private Student student;
    //提供有參的構造方法

    public LxStudent(Student student) {
        super();
        this.student = student;
    }

    public LxStudent() {
        super();
       
    }
// 對方法進行裝飾(升級)
    @Override
    public void study() {
        // 呼叫原有方法
        student.study();
        //裝飾新功能
        System.out.println("學習挖掘機");
    }
    
}

二.列印流

特點:

  • 1.永遠不會拋IO異常
  • 2.原樣輸出到目的端

列印流有兩種:PrintStream和PrintWriter

  • PrintStream 構造方法: 字串路徑 檔案物件 位元組流物件
  • PrintWriter 構造方法: 字串路徑 檔案物件 位元組流物件 字元流物件。 注意: 只有操作流物件,才能自動重新整理。PrintWriter的自動flush功能,只有在new PrintWriter物件的時候呼叫PrintWriter(Writer out, boolean autoFlush),並將 autoFlush設定為true才會自動flush,否則不會自動flush,必須手動printWriter.flush()才能成功列印資料

經常遇見的列印流:

  • System in System.in是BufferedInputStream型別

  • System out System out是PrintStream型別

簡單例題: 從控制檯輸入文字 寫到檔案中(可以寫中文) 使用 System.in 利用轉換流 高效流 列印流(原樣輸出 自動重新整理)

    public static void main(String[] args) throws IOException {
        System.out.println("請輸入:");
        InputStream in = System.in;
        // 使用轉換流 將位元組轉字元
        
        InputStreamReader isr = new InputStreamReader(in);
        // 讀一行 BufferedReader readline()
        BufferedReader br = new BufferedReader(isr);
        // 列印流原樣輸出 一次寫一行檔案
        File file = new File("/Users/lanou/Desktop/Test/talang.txt");
        FileWriter fw = new FileWriter(file);
        PrintWriter pw = new PrintWriter(fw, true);
        int num = 0;
        //讀寫
        String string = "";
        while ((string = br.readLine()) != null) {
            num++;
            // 結束條件
            if (string.equals("quit")) {
                break;
            }
            // 寫入檔案
            pw.println(num + ":" + string);
        }
        // 關閉資源
        br.close();
        pw.close();
    }

四.合併流

SequenceInputStream 作用:作用:可以將多個檔案合併成一個新的檔案。 構造方法: 1.SequenceInputStream(InputStream s1, InputStream s2) 通過記住這兩個引數來初始化新建立的 SequenceInputStream(將按順序讀取這兩個引數,先讀取 s1,然後讀取 s2),以提供從此 SequenceInputStream 讀取的位元組。 缺點:只能將兩個檔案合併成一個新的檔案。

2.SequenceInputStream(Enumeration<? extends InputStream> e) 通過記住引數來初始化新建立的 SequenceInputStream,該引數必須是生成執行時型別為 InputStream 物件的 Enumeration 型引數。 優點:可以將多個檔案合併成一個新檔案。

簡單例題: 合併三個檔案 SequenceInputStream(Enumeration<? extends InputStream> e) 將要合併的檔案三個流 新增到vector

        File f1 = new File("/Users/lanou/Desktop/Test/1.txt");
        File f2 = new File("/Users/lanou/Desktop/Test/2.txt");
        File f3 = new File("/Users/lanou/Desktop/Test/3.txt");
        // 建立位元組流 並將三個流新增到集合
        Vector<FileInputStream> vector = new Vector<>();
        vector.add(new FileInputStream(f1));
        vector.add(new FileInputStream(f2));
        vector.add(new FileInputStream(f3));
        // 獲取迭代器(列舉器)
        Enumeration<FileInputStream> elements = vector.elements();
        // 合併檔案
        SequenceInputStream sis = new SequenceInputStream(elements);
        InputStreamReader isr = new InputStreamReader(sis);
        BufferedReader br = new BufferedReader(isr);
        File file = new File("/Users/lanou/Desktop/Test/5.txt");
        FileWriter fw = new FileWriter(file);
        PrintWriter pw = new PrintWriter(fw, true);
        
        String string = null;
        while ((string = br.readLine()) != null) {
            // 寫
            pw.println(string);
        }
        br.close();
        pw.close();
    }