0

I'm currently studying for my JAVA SE OCP Certification so and playing around with things to learn.

I'm currently on IO chapter. I'm trying to combine a ScheduledExecutor with a BufferedWriter

ScheduledExecutorService service = null;
try (BufferedWriter bw = new BufferedWriter(new FileWriter(testFile))) {
    service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleAtFixedRate(() -> {
        try {
            bw.write("Curr Time: " + LocalTime.now());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }, 1, 1, TimeUnit.SECONDS);
}

I expected to write the LocalTime every second on a new line on my TestFile but this IOException shows up:

java.io.IOException: Stream closed
at java.io.BufferedWriter.ensureOpen(BufferedWriter.java:116)
at java.io.BufferedWriter.write(BufferedWriter.java:221)
at java.io.Writer.write(Writer.java:157)
at Worksheet.lambda$main$0(Worksheet.java:56)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) {...}
Miss Chanandler Bong
  • 4,081
  • 10
  • 26
  • 36

1 Answers1

0

Try with:

ScheduledExecutorService service = null;
    service = Executors.newSingleThreadScheduledExecutor();
    try {
        BufferedWriter bw = new BufferedWriter(new FileWriter(testFile, true));
        service.scheduleAtFixedRate(() -> {
            try {
                bw.write("Curr Time: " + LocalTime.now() + "\n");
                bw.flush();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }, 1, 1, TimeUnit.SECONDS);

    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

The true parameter in the FileWriter will append each new line to the existing file, instead of creating a new file.

razumichin
  • 84
  • 1
  • 3
  • 6
  • While this works perfectly, won't this create a new BufferedWriter object every SingleThreadScheduled run leading to non-efficient code? – Marian Gabriel Neacsu Aug 21 '19 at 15:24
  • This will work because `BufferedWriter` is thread safe as explained [`here`](https://stackoverflow.com/questions/30080560/is-writting-on-file-using-bufferwriter-initialized-by-filewriter-thread-safe-or) – Michał Krzywański Aug 21 '19 at 16:40