如 果你要處理的是字元為主的資料,則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])
);
new InputStreamReader(new URL(args[0]).openStream()),
new FileWriter(args[1])
);
InputStreamReader是Reader的子類別,可在InputStream套上字元轉換的功能(相對的 OutputStreamWriter則可為OutputStream套上字元轉換功能),預設編碼是作業系統編碼,你也可以在建構時指定轉換時所使用的 編碼。
實際上系統底層資料的流動,仍是透過InputStream、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));
}
}
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));
}
}