Java difference between FileWriter and BufferedWriter

109,700

Solution 1

BufferedWriter is more efficient if you

  • have multiple writes between flush/close
  • the writes are small compared with the buffer size.

In your example, you have only one write, so the BufferedWriter just add overhead you don't need.

so does that mean the first example writes the characters one by one and the second first buffers it to the memory and writes it once

In both cases, the string is written at once.

If you use just FileWriter your write(String) calls

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

This makes one system call, per call to write(String).


Where BufferedWriter improves efficiency is in multiple small writes.

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

Without a BufferedWriter this could make 200 (2 * 100) system calls and writes to disk which is inefficient. With a BufferedWriter, these can all be buffered together and as the default buffer size is 8192 characters this become just 1 system call to write.

Solution 2

You are right. Here is how write() method of BufferedWriter looks:

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

As you can see it indeed checks whether the buffer is full (if (nextChar >= nChars)) and flushes the buffer. Then it adds new character to buffer (cb[nextChar++] = (char) c;).

Solution 3

BufferedWriter is more efficient. It saves up small writes and writes in one larger chunk if memory serves me correctly. If you are doing lots of small writes then I would use BufferedWriter. Calling write calls to the OS which is slow so having as few writes as possible is usually desirable.

Share:
109,700
Opi
Author by

Opi

Freelance web developer for 8 years

Updated on July 05, 2022

Comments

  • Opi
    Opi almost 2 years

    What's the difference between those? I'm just learning Java ATM, but it seems like I can write to a file both ways i.e. (I didn't copy the try-catch block here.)

    FileWriter file = new FileWriter("foo.txt");
    file.write("foobar");
    file.close();
    

    and

    FileWriter file = new FileWriter("foo.txt");
    BufferedWriter bf = new BufferedWriter(file);
    bf.write("foobar");
    bf.close();
    

    I understand the concept of buffering the data first, so does that mean the first example writes the characters one by one and the second first buffers it to the memory and writes it once?

  • JaskeyLam
    JaskeyLam over 7 years
    I have a question that when I am using FileWriter, after write returns , does java guarantee that the content is flush in disk OR just in pagecache which os will flush when needed?
  • Vishy
    Vishy over 7 years
    @Jaskey if you use FIleWriter unbuffered, write() means the OS has a copy which should be written to disk eventually.