Java 提供兩種打印流:PrintWriter(字元流)與 PrintStream(位元組流)。它們共同特點:
print()/println() 支援多種資料型別System.out.print(Object) 實際呼叫物件的 toString()PrintStream 預設即具備自動 flush(遇換行符自動刷新)。
PrintWriter 預設不自動 flush,必須在建構式指定 new PrintWriter(writer, true) 才啟用自動刷新(僅在 println()/printf()/format() 觸發)。
PrintWriter 可包裝 Writer 或直接包裝 OutputStream/File/String 路徑;PrintStream 則專注位元組流包裝。
public class PrintStreamTest {
public static void main(String[] args) {
PrintStream ps = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream("E:/test/output.txt");
ps = new PrintStream(fos);
System.setOut(ps); // 標準輸出重導向
for (int i = 0; i < 3000; i++) {
System.out.print(i + " ");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
closeQuietly(ps);
closeQuietly(fos);
}
}
}
public class PrintWriterTest {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = null;
try {
// autoFlush = true
pw = new PrintWriter(new FileWriter("E:/test/log.txt", true), true);
String line;
while ((line = br.readLine()) != null) {
if ("exit".equals(line)) break;
System.out.println(line); // 顯示於控制台
pw.println("-----------------------"); // 寫入檔案
pw.println(line);
}
pw.println("-------------" + new Date() + "------------");
} catch (IOException e) {
e.printStackTrace();
} finally {
closeQuietly(br);
closeQuietly(pw);
}
}
}
PrintWriter 需顯式啟用 autoFlush 才會自動刷新,否則資料停留在緩衝區IOException,可透過 checkError() 檢查狀態System.out 本質是 PrintStream,可重導向實現日誌落檔