BufferedWriter not writing everything to its output file

前端 未结 9 1817
悲哀的现实
悲哀的现实 2020-11-22 03:35

I have a Java program that reads some text from a file, line by line, and writes new text to an output file. But not all the text I write to my BufferedWriter a

9条回答
  •  有刺的猬
    2020-11-22 04:24

    You must close() your BufferedWriter. You must close() your BufferedWriter because it IS-A Writer and thus implements AutoCloseable, which means (emphasis added) it is

    A resource that must be closed when it is no longer needed.

    Some people say you must first call flush() for your BufferedWriter before calling close(). They are wrong. The documentation for BufferedWriter.close() notes that it "Closes the stream, flushing it first" (emphasis added).

    The documented semantics of flushing (flush()) are

    Flushes this stream by writing any buffered output to the underlying stream

    So, you must close, and close will flush any buffered output.

    Your output file does not include all the text you wrote to your BufferedWriter because it stored some of that text in a buffer. The BufferedWriter never emptied that buffer, passing it through to the file, because you never told it to do so.


    Since Java 7, the best way to ensure an AutoCloseable resource, such as a BufferedWriter, is closed when it is not longer need is to use automatic resource management (ARM), also known as try-with-resources:

     try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) {
        // writes to out here
     } catch (IOException ex) {
        // handle ex
     }
    

    You must also close your BufferedReader when it is no longer need, so you should have nested try-with-resources blocks:

     try (BufferedReader in = new BufferedReader(new FileReader("nyccrash.txt")) {
        try (BufferedWriter out = new BufferedWriter(new FileWriter("nyccrash.sql"))) {
           // your reading and writing code here
        }
     } catch (IOException ex) {
        // handle ex
     }
    

    Do not be tempted (as other answers here suggest) just to call close() at the end of your method, when your code has "finished" using the writer. That will not work if your writing code throws an exception, and in particular if it throws an IOException.

提交回复
热议问题