How to close BufferedWriter after waiting for its write completion

Alan :

My JavafX application is recognizing speech and converting it to text (which I log to a text file using an ExecutorService for every write process), as soon as I close the stage I call a method from my Main Thread to close the BufferedWriter.

Listener Thread Snippet (shares Observer - Observable pattern with Main):

@Override
public void stopSTT() {
    try {
        recognizer.stopContinuousRecognitionAsync().get();
        speechLogger.close();
    } catch (InterruptedException | ExecutionException  e) {
        e.printStackTrace();
    }
}  

SpeechLogger:

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();
    }
}  

Writing process:

 SpeechLogger speechLogger = new SpeechLogger();
 executor.submit(new Runnable() {
                        public void run() {
                            System.out.println("    WRITING to file...");
                            speechLogger.log(e.getResult().getText());
                        }
                    });

I call stopSTT from my Main thread. However when I close it and the bufferedWriter is still writing, what is the case IMO, I get the following Error output:

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)  
JB Nizet :

Shut down the executor, then await for its termination, then finally close the logger.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=148684&siteId=1