Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When to flush a BufferedWriter

Tags:

java

io

In a Java program (Java 1.5), I have a BufferedWriter that wraps a Filewriter, and I call write() many many times... The resulting file is pretty big...

Among the lines of this file, some of them are incomplete...

Do I need to call flush each time I write something (but I suspect it would be inefficient) or use another method of BufferedWriter or use another class...?

(Since I've a zillion lines to write, I do want to have something quite efficient.) What would be the ideal "flushing" moment? (when I reach the capacity of the BufferedWriter)...

Init:

try {   analysisOutput = new BufferedWriter(new FileWriter(       "analysisResults", true));   analysisOutput.newLine();   analysisOutput.write("Processing File " + fileName + "\n"); }  catch (FileNotFoundException ex) {   ex.printStackTrace(); }  catch (IOException ex) {   ex.printStackTrace(); } 

Writing:

private void printAfterInfo(String toBeMoved,HashMap<String, Boolean> afterMap, Location location)   throws IOException {     if(afterMap != null) {       for (Map.Entry<String, Boolean> map : afterMap.entrySet()) {         if (toBeMoved == "Condition") {           if (1 <= DEBUG)             System.out.println("###" + toBeMoved + " " + location + " "                 + conditionalDefs.get(conditionalDefs.size() - 1)                 + " After " + map.getKey() + " "                 + map.getValue() + "\n");            analysisOutput.write("###" + toBeMoved + " " + location + " "               + conditionalDefs.get(conditionalDefs.size() - 1)               + " After " + map.getKey() + " " + map.getValue()               + "\n");         } else {           if (1 <= DEBUG)             System.out.println("###" + toBeMoved + " " + location + " "                 + map.getKey() + " After "                  + map.getValue() + "\n");           if (conditionalDefs.size() > 0)             analysisOutput.write("###" + toBeMoved + " " + location + " "                 + conditionalDefs.get(conditionalDefs.size() - 1) + " "                 + map.getKey() + " After " + map.getValue()                 + "\n");           else             analysisOutput.write("###" + toBeMoved + " " + location + " " + map.getKey() + " After " + map.getValue() + "\n");           }       }     } 

I've just figured out that the lines which are incomplete are those just before "Processing file"... so it occurs when I'm switching from one file that I analyze to another...

Closing:

dispatch(unit);  try {   if (analysisOutput != null) {     printFileInfo();     analysisOutput.close();   } }  catch (IOException ex) {   ex.printStackTrace(); } 

Sometimes the information printed out by printFileInfo does not appear in the results file...

like image 703
LB40 Avatar asked May 25 '09 21:05

LB40


People also ask

Do you need to flush BufferedWriter?

IIRC a BufferedWriter is NOT thread-safe, so that could be an explanation, but it does NOT have to be "flushed manually" to make more room, it takes care of that itself.

What does flush do in BufferedWriter?

flush() method flushes the characters from a write buffer to the character or byte stream as an intended destination.


1 Answers

The BufferedWriter will already flush when it fills its buffer. From the docs of BufferedWriter.write:

Ordinarily this method stores characters from the given array into this stream's buffer, flushing the buffer to the underlying stream as needed.

(Emphasis mine.)

The point of BufferedWriter is basically to consolidate lots of little writes into far fewer big writes, as that's usually more efficient (but more of a pain to code for). You shouldn't need to do anything special to get it to work properly though, other than making sure you flush it when you're finished with it - and calling close() will do this and flush/close the underlying writer anyway.

In other words, relax - just write, write, write and close :) The only time you normally need to call flush manually is if you really, really need the data to be on disk now. (For instance, if you have a perpetual logger, you might want to flush it every so often so that whoever's reading the logs doesn't need to wait until the buffer's full before they can see new log entries!)

like image 197
Jon Skeet Avatar answered Oct 21 '22 17:10

Jon Skeet