[英]How to close BufferedWriter after waiting for its write completion
我的JavafX
應用程序正在識別語音並將其轉換為文本(我為每個寫入過程使用 ExecutorService 將其記錄到文本文件中),一旦我關閉stage
我就會從我的主線程調用一個方法來關閉BufferedWriter
。
偵聽器線程片段(與 Main 共享 Observer - Observable 模式):
@Override
public void stopSTT() {
try {
recognizer.stopContinuousRecognitionAsync().get();
speechLogger.close();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
語音記錄器:
private BufferedWriter bufferedWriter;
public SpeechLogger(String filename){
try {
FileWriter fileWriter = new FileWriter(filename, true);
this.bufferedWriter = new BufferedWriter(fileWriter);
} catch (IOException e) {
e.printStackTrace();
}
}
public void log(String recognized){
try {
bufferedWriter.write(String.format("[%s: %s] %s\n","INFO",new Date(),recognized));
} catch (IOException e) {
e.printStackTrace();
}
}
public void log(String recognized, String translation){
try {
bufferedWriter.write(String.format("[INFO %s] [ORIGINAL] %s [TRANSLATED] %s\n", new Date(),recognized,translation));
} catch (IOException e) {
e.printStackTrace();
}
}
public void close(){
try{
bufferedWriter.close();
System.out.println("Buffered writer closed...");
}catch (IOException e){
e.printStackTrace();
}
}
寫作過程:
SpeechLogger speechLogger = new SpeechLogger();
executor.submit(new Runnable() {
public void run() {
System.out.println(" WRITING to file...");
speechLogger.log(e.getResult().getText());
}
});
我從我的Main
線程調用stopSTT
。 但是,當我關閉它並且bufferedWriter
仍在寫入時,IMO 是什么情況,我得到以下錯誤輸出:
WRITING to file...
java.io.IOException: Stream closed
Session stopped event.
at java.base/java.io.BufferedWriter.ensureOpen(BufferedWriter.java:107)
at java.base/java.io.BufferedWriter.write(BufferedWriter.java:224)
at java.base/java.io.Writer.write(Writer.java:249)
at speechToText.logic.SpeechLogger.log(SpeechLogger.java:23)
at speechToText.logic.SpeechServiceOneLang$1.run(SpeechServiceOneLang.java:56)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:835)
關閉 executor ,然后等待其終止,最后關閉記錄器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.