由於以前采用的一些典型形式都涉及到文件處理,所以大家也許會懷疑為什麼要進行那麼多的代碼輸入——這正是裝飾器方案一個缺點。本部分將向大家展示如何創建和使用典型文件讀取和寫入配置的快捷版本。這些快捷版本均置入packagecom.bruceeckel.tools中(自第5章開始創建)。為了將每個類都添加到庫內,只需將其置入適當的目錄,並添加對應的package語句即可。
7. 快速文件輸入
若想創建一個對象,用它從一個緩沖的DataInputStream中讀取一個文件,可將這個過程封裝到一個名為InFile的類內。如下所示:
//: InFile.java // Shorthand class for opening an input file package com.bruceeckel.tools; import java.io.*; public class InFile extends DataInputStream { public InFile(String filename) throws FileNotFoundException { super( new BufferedInputStream( new FileInputStream(filename))); } public InFile(File file) throws FileNotFoundException { this(file.getPath()); } } ///:~
無論構建器的String版本還是File版本都包括在內,用於共同創建一個FileInputStream。
就象這個例子展示的那樣,現在可以有效減少創建文件時由於重復強調造成的問題。
8. 快速輸出格式化文件
亦可用同類型的方法創建一個PrintStream,令其寫入一個緩沖文件。下面是對com.bruceeckel.tools的擴展:
//: PrintFile.java // Shorthand class for opening an output file // for human-readable output. package com.bruceeckel.tools; import java.io.*; public class PrintFile extends PrintStream { public PrintFile(String filename) throws IOException { super( new BufferedOutputStream( new FileOutputStream(filename))); } public PrintFile(File file) throws IOException { this(file.getPath()); } } ///:~
注意構建器不可能捕獲一個由基礎類構建器“擲”出的違例。
9. 快速輸出數據文件
最後,利用類似的快捷方式可創建一個緩沖輸出文件,用它保存數據(與由人觀看的數據格式相反):
//: OutFile.java // Shorthand class for opening an output file // for data storage. package com.bruceeckel.tools; import java.io.*; public class OutFile extends DataOutputStream { public OutFile(String filename) throws IOException { super( new BufferedOutputStream( new FileOutputStream(filename))); } public OutFile(File file) throws IOException { this(file.getPath()); } } ///:~
非常奇怪的是(也非常不幸),Java庫的設計者居然沒想到將這些便利措施直接作為他們的一部分標准提供。