Although oddly enough, it seems that the FileWriter has its own internal buffering (or perhaps the underlying system I'm on is buffering the output of the FileWriter). I don't pretend to understand what's going on under the hood in this case. I know it seems incorrect to buffer what appears to be an already buffered stream, but for the sake of portability, you might want to consider doing this. In addition, you can specify the size of the buffer that a BufferedWriter will use, so you have some more control over the specifics of when it'll flush.
In general, a Writer sends its output immediately to the underlying character or byte stream. Unless prompt output is required, it is advisable to wrap a BufferedWriter around any Writer whose write() operations may be costly, such as FileWriters and OutputStreamWriters. For example,
= new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
will buffer the PrintWriter's output to the file. Without buffering, each invocation of a print() method would cause characters to be converted into bytes that would then be written immediately to the file, which can be very inefficient.