簡體   English   中英

等待寫入完成后如何關閉 BufferedWriter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM