java里面缓冲流里面缓冲区满了不会自动flush写入文件

问下为啥我这char数组大小都超过缓冲区2个字节的大小了,我看文件还没有自动写入,这是为啥?缓冲区不是满了就会自动flush吗,就会写入到文件嘛?

img

你设置缓存大小为2,只是表示你的显示缓存BufferedWriter失效应该刷新,在最底层有个默认的8192缓存,你的数据不够所以没有刷出.如果你一定要看下效果的话可以运行看下效果,就是你要的预期了

import lombok.SneakyThrows;
import sun.nio.cs.StreamEncoder;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.nio.ByteBuffer;

public class Test03 {
    @SneakyThrows
    public static void main(String[] args) {
        final FileWriter fileWriter = new FileWriter("test.txt");
        changeBufferTo2(fileWriter);
        final BufferedWriter bufferedWriter = new BufferedWriter(fileWriter, 2);
        final char[] chars = {'8', '2', '3', '4', '5'};
        bufferedWriter.write(chars);
    }

    private static void changeBufferTo2(FileWriter fileWriter) throws NoSuchFieldException, IllegalAccessException {
        final Field se = OutputStreamWriter.class.getDeclaredField("se");
        se.setAccessible(true);
        final StreamEncoder o = (StreamEncoder) se.get(fileWriter);
        final Field bb = o.getClass().getDeclaredField("bb");
        bb.setAccessible(true);
        bb.set(o, ByteBuffer.allocate(2));
    }
}

在写入大文件时,每次写入的时候, 建议调用flush() 方法。虽然当缓冲区内容跟满时 ,会自动写入文件中 但是,如果你也忘记调用close()方法的时候, 有可能最后写入的数据一直在缓冲区中而没有写入到文件中,导致数据的缺失
【代码示例,仅供参考】

File file=new File("a.txt");                            //1
PrintWriter writer=new PrintWriter(file);   //2
String text="?";
writer.write(text);     //3
writer.close()     //4

参考链接,希望有帮助

使用BufferedWriter时,写入的数据并不会先输出到目的
地,而是先存储至缓冲区中。如果缓冲区中的数据满了,
才会一次对目的地进行写出。BufferedWriter的缓冲区如
果不清空,有可能有部分内容只是写进缓冲区,但没有真
正写入文件,这样很可能导致文件内容不全甚至是空白。