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();
}