java.io.FileWriter在写入输出流之前是否缓冲字节

Kum*_*ran 4 java file-io filewriter fileoutputstream bufferedwriter

根据Java文档,

通常,Writer立即将其输出发送到基础字符或字节流。除非需要及时输出,否则建议将BufferedWriter包装在其write()操作可能会很昂贵的所有Writer周围,例如FileWriters和OutputStreamWriters。例如,

PrintWriter out =新的PrintWriter(新的BufferedWriter(新的FileWriter(“ foo.out”))));

将缓冲PrintWriter的输出到文件。如果不进行缓冲,则每次调用print()方法都会导致将字符转换为字节,然后将这些字节立即写入文件中,这可能会非常低效。

但是以下代码似乎像FileWriter在刷新到输出流之前也缓冲字节一样。

 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;


 public class TestFileWriter {
 /**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    FileWriter fileWriter= new FileWriter("test.txt");
    File file=new File("test.txt");
    for (int i=0; i<1000; i++) {
        fileWriter.write("a very long string, a very long string, a very long string, a very long string, a very long string\n");
        if(i%50 == 0)
            System.out.print("file size=" +  file.length()+",");

    }
    fileWriter.close();
    System.out.println("file size=" +  file.length());

}

}
Run Code Online (Sandbox Code Playgroud)

输出:-

文件大小= 0,文件大小= 0,文件大小= 8192,文件大小= 8192,文件大小= 16384,文件大小= 24576,文件大小= 24576,文件大小= 32768,文件大小= 32768,文件大小= 40960,文件大小= 49152,文件大小= 49152,文件大小= 57344,文件大小= 57344,文件大小= 65536,文件大小= 73728,文件大小= 73728,文件大小= 81920,文件大小= 81920,文件大小= 90112,档案大小= 99000

为什么在写入数据时和写入时不将数据写入文件?

Pet*_*rey 5

如果添加

fileWriter.flush();
Run Code Online (Sandbox Code Playgroud)

您会看到每行的尺寸都已更改。这意味着正在发生缓冲。

使用调试器,我将此跟踪到了StreamEncoder,它在Oracle JDK中没有源,但可以在线使用

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/cs/StreamEncoder.java

private static final int DEFAULT_BYTE_BUFFER_SIZE = 8192;

private StreamEncoder(OutputStream out, Object lock, CharsetEncoder enc) {
    // some deleted
    if (ch == null) {
        bb = ByteBuffer.allocate(DEFAULT_BYTE_BUFFER_SIZE);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,编码器具有自己的缓冲区。

注意:由于这是一个内部类,因此将来可能会更改,并且可能无法在所有平台上以这种方式运行。