我創建了一個 I/O 類來讀取一些文本并將其附加到檔案中。
我以為它已經寫好了,但由于某些原因,它沒有顯示在檔案中——盡管程式可以識別它。
該檔案TestResult.csv位于src/main/resources程式檔案夾內的檔案夾中。
我從 HowToDoInJava 的教程中學習了如何打開和閱讀它:從“資源”檔案夾中讀取檔案。
我的代碼
前幾行代碼與網站中的示例非常相似。
import java.io.*;
import java.nio.file.Files;
import java.io.FileWriter;
public class ReadResourceFileDemo {
public static void main(String[] args) throws IOException {
//open file
ClassLoader classLoader = IOLab.class.getClassLoader();
File file = new File(classLoader.getResource("TestResult.csv").getFile());
//append
try (FileWriter fw=new FileWriter(file, true)) {
fw.append("\nJulie,Brown,100,A");
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
}
}
}
我得到了什么 TestResult.csv
Alex,Smith,99,A
Jolene,Schmidt,100,A
Mackinzie,Jensen,86,B
目標是將字串附加到TestResult.csv.
第一次運行后,結果是:
Alex,Smith,99,A
Jolene,Schmidt,100,A
Mackinzie,Jensen,86,B
然后我第二次再次運行并得到:
"C:\Program Files\Java\jdk-16.0.2\bin\java.exe" "-javaagent:C:\Program
Files\JetBrains\IntelliJ IDEA 2021.2.1\lib\idea_rt.jar=56365:C:\Program
Files\JetBrains\IntelliJ IDEA 2021.2.1\bin" -Dfile.encoding=UTF-8 -classpath
C:\Users\tuant\IdeaProjects\untitled\target\classes edu.sdccd.cisc191.ReadResourceFileDemo
Alex,Smith,99,A
Jolene,Schmidt,100,A
Mackinzie,Jensen,86,B
Julie,Brown,100,A
Process finished with exit code 0
問題
這意味著程式第一次跳過了附加,或者它跳過了但由于某種原因沒有顯示在檔案中。
When I open the file TestResult.csv it only has the first 3 lines.
However, the 4th line that appended manually as
Julie,Brown,100,A didn't show up.
Thanks a lot for any help!
uj5u.com熱心網友回復:
發生了什么
當您第一次打開并寫入時,它會被寫入緩沖區。該緩沖區保存在try-with 塊內。但緩沖區尚未重繪 。通過顯式呼叫flush()或關閉 IO-stream/writer來重繪 它,這是通過以下方式隱式完成的close():
關閉流,首先重繪 它。
和close自動地和隱含地呼叫時try與所述關閉大括號塊結束}。try-with 塊的這種節省資源的態度是一個稱為auto-closeable的概念的好處。該介面AutoCloseable由大多數 IO-steams 實作,例如FileWriter.
由于您的獨立讀取操作Files.readAllBytes(file.toPath())也在此try-with 塊內,因此它從磁盤上的檔案讀取,而不是從緩沖區讀取。
怎么修
從理論上講,從 的緩沖區讀取是合乎邏輯的fw,但這并不容易。
但是,您可以使用然后讀取try-with 塊內的緩沖區fw.flush()。此重繪 將緩沖區寫入磁盤,因此您可以從磁盤讀取并期望重繪 的內容顯示為已讀。
或者,您可以在try-with 塊之后移動讀取操作,以確保之前已重繪 和寫入緩沖區。
Epicblood 的回答中建議了這兩種修復方法- 有點過時但有效。
uj5u.com熱心網友回復:
嘗試呼叫 上的flush方法filewriter。
在第一次運行中,可能會出現緩沖區未重繪 到檔案中的情況。通常,flush在寫入檔案后呼叫是一種很好的做法。
uj5u.com熱心網友回復:
你需要重繪 你的作家:
try (FileWriter fw=new FileWriter(file, true)) {
fw.append("\nJulie,Brown,100,A");
fw.flush();
}
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336692.html
