Java 中的 PrintWriter 與 FileWriter
1. 概述
Java 標準函式庫提供了用於檔案操作的 API。 PrintWriter
和FileWriter
類別有助於將字元寫入檔案。但是,這兩個類別適用於不同的用例。
在本教程中,我們將探討有關PrintWriter
和FileWriter
用例的詳細資訊。此外,我們還將看到這兩個類別之間的差異和相似之處。
2. PrintWriter
PrintWriter
類別幫助將格式化文字寫入檔案和控制台等輸出流。
此外, PrintWriter
類別中的方法不會拋出IOException
。相反,它有checkError()
方法來了解寫入操作的狀態。如果寫入操作通過,則checkError()
方法returns
false;如果由於錯誤而失敗,則傳回true
。
此外,如果在檢查錯誤狀態之前未關閉流,則checkError()
會刷新流。
此外, PrintWriter
還提供了一個名為flush()
的方法來在寫入操作後明確刷新流。但是,當與try
-with-resources 區塊一起使用時,無需明確刷新流。
2.1. PrintWriter.println()
println()
方法將字串寫入輸出流並以新行結束。它無法將格式化文字寫入輸出流。
此外, PrintWriter
也提供了print()
方法,以防我們決定不以新行終止字串。
下面是使用println()
方法將字串寫入檔案的範例:
@Test
void whenWritingToTextFileUsingPrintWriterPrintln_thenTextMatches() throws IOException {
String result = "I'm going to Alabama\nAlabama is a state in the US\n";
try (PrintWriter pw = new PrintWriter("alabama.txt");) {
pw.println("I'm going to Alabama");
pw.println("Alabama is a state in the US");
}
Path path = Paths.get("alabama.txt");
String actualData = new String(Files.readAllBytes(path));
assertEquals(result, actualData);
}
在這裡,我們建立一個PrintWriter
對象,它將檔案路徑作為參數。接下來,我們呼叫PrintWriter
物件的println()
方法將字元寫入檔案。
最後,我們斷言預期結果等於文件內容。
值得注意的是, PrintWriter
也提供了write()
方法來將文字寫入文件,我們可以用它來取代println()
方法。
2.2. PrintWriter.printf()
printf()
方法有助於將格式化文字寫入輸出流。我們可以使用%s
、 %d
、 .2f
等格式說明符將不同的資料類型寫入輸出流。
讓我們來看看一些使用printf()
將格式化資料寫入檔案的範例程式碼:
@Test
void whenWritingToTextFileUsingPrintWriterPrintf_thenTextMatches() throws IOException {
String result = "Dreams from My Father by Barack Obama";
File file = new File("dream.txt");
try (PrintWriter pw = new PrintWriter(file);) {
String author = "Barack Obama";
pw.printf("Dreams from My Father by %s", author);
assertTrue(!pw.checkError());
}
try (BufferedReader reader = new BufferedReader(new FileReader(file));) {
String actualData = reader.readLine();
assertEquals(result, actualData);
}
}
在上面的程式碼中,我們將格式化文字寫入檔案。我們使用%s
標識符直接將String
資料類型加入到文字中。
此外,我們建立了BufferedReader
的實例,它將FileReader
物件作為參數來讀取檔案的內容。
由於該方法不會拋出IOException
,因此我們呼叫checkError()
方法來了解寫入操作的狀態。在這種情況下, checkError()
傳回false,
表示沒有錯誤。
3. FileWriter
FileWriter
類別擴充了Writer
類別。它提供了一種使用預設緩衝區大小將字元寫入檔案的便捷方法。
FileWriter
不會自動刷新緩衝區。我們需要呼叫flush()
方法。但是,當FileWriter
與try
-with-resources 區塊一起使用時,它會在退出區塊時自動刷新並關閉流。
此外,在檔案遺失、檔案無法開啟等情況下,它會拋出IOException
。
與PrintWriter
不同,它無法將格式化文字寫入檔案。
讓我們來看一個使用FileWriter
類別中的write()
方法將字元寫入File
範例:
@Test
void whenWritingToTextFileUsingFileWriter_thenTextMatches() throws IOException {
String result = "Harry Potter and the Chamber of Secrets";
File file = new File("potter.txt");
try (FileWriter fw = new FileWriter(file);) {
fw.write("Harry Potter and the Chamber of Secrets");
}
try (BufferedReader reader = new BufferedReader(new FileReader(file));) {
String actualData = reader.readLine();
assertEquals(result, actualData);
}
}
在上面的程式碼中,我們建立了一個File
實例並將其傳遞給FileWriter
物件。接下來,我們呼叫FileWriter
物件的write()
方法將字串寫入檔案。
最後,我們斷言預期結果等於文件的內容。
4。結論
在本文中,我們透過範例程式碼學習了FileWriter
和PrintWriter
的基本用法。
FileWriter
的主要用途是將字元寫入檔案。然而, PrintWriter
有更多的功能。除了檔案之外,它還可以寫入其他輸出流。此外,它還提供了一種將格式化文字寫入檔案或控制台的方法。
與往常一樣,範例的原始程式碼可在 GitHub 上取得。