|
|
如
果你要處理的是字元為主的資料,則Java提供了Reader、Writer。Reader可以從資料來源讀取字元資料,Writer則可以向目的地寫入
字元資料。 舉個例子來說,你可以設計這麼一個方法: public static void dump(Reader reader, Writer writer) throws Exception { BufferedReader bufReader = new BufferedReader(reader); BufferedWriter bufWriter = new BufferedWriter(writer); String input = null; while((input = bufReader.readLine()) != null) { bufWriter.write(input); bufWriter.newLine(); } bufReader.close(); bufWriter.close(); } 在這邊使用到 BufferedReader、 BufferedWriter,Reader、Writer 與其一些子類別也實現了Decorator 模式(就如同 InputStream、 OutputStream 中介紹過的), 例如 BufferedReader、 BufferedWriter 為 Reader、Writer 提供了緩衝區的作用,但其本身並未直接改變 Reader、Writer 的行為。 你可以這麼使用dump()方法,這是一個複製純文字檔案的例子: dump(new
FileReader(args[0]), new FileWriter(args[1]));
也可以用來下載一個HTML網頁: dump(
new InputStreamReader(new URL(args[0]).openStream()), new FileWriter(args[1]) ); InputStreamReader是Reader的子類別,可在InputStream套上字元轉換的功能(相對的 OutputStreamWriter則可為OutputStream套上字元轉換功能),預設編碼是作業系統編碼,你也可以在建構時指定轉換時所使用的 編碼。 實際上系統底層資料的流動,仍是透過OutputStream、OutputStream,以FileWriter為例,其繼承了 OutputStreamWriter,以直接提供讀取純文字檔案的功能,在建構FileWriter實例時,實際上內部直接使用 FileOutputStream: package
java.io;
public class FileWriter extends OutputStreamWriter { public FileWriter(String fileName) throws IOException { super(new FileOutputStream(fileName)); } public FileWriter(String fileName, boolean append) throws IOException { super(new FileOutputStream(fileName, append)); } public FileWriter(File file) throws IOException { super(new FileOutputStream(file)); } public FileWriter(FileDescriptor fd) { super(new FileOutputStream(fd)); } } |