为什么fileWriter在bufferedWriter和printWriter之前写入输出文件?

Why fileWriter is witten in the output file before bufferedWrite and printWriter?

我正在尝试一些 Java.io 类,例如 FileFileWriterBufferedWriterPrintWriter

我不明白为什么 FileWrite .write() 方法总是在所有其他 bufferedWriter 和 printWriter 的 .write() and/or .println() 方法之前打印。

try(FileWriter fileWriter = new FileWriter("file.res");
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
            PrintWriter printWriter = new PrintWriter(bufferedWriter)){

            bufferedWriter.write("BufferedReader\n");

            printWriter.println("PrintWriter");

            fileWriter.write("FileWriter\n");

        }catch (Exception e){
            e.printStackTrace();
        }

产生输出:

FileWriter
BufferedReader
PrintWriter

正常吗?为什么?

是的。

FileWriter 没有缓冲,所以写入它会立即写入磁盘。

BufferedWriter 首先写入缓冲区(在内存中)。 PrintWriter 本身没有缓冲,因此它会立即写入底层 BufferedWriter,因此也会写入内存。对于这两个,写入操作的顺序是保持的,因为它们是按照相同的顺序写入内存的。

try-with-resources 块完成时,资源(Writers)被隐式关闭。在关闭之前,调用写入器的 flush 方法,导致缓冲区的内容写入底层写入器 - FileWriter - 并因此写入磁盘。

所以执行顺序是

bufferedWriter.write("BufferedReader\n"); -> buf[0..n]
printWriter.println("PrintWriter"); -> buf[n+1...m]
fileWriter.write("FileWriter\n"); -> file[0..a]

//implicit close
bufferdWriter.close(); buf[0..m] -> file[a+1..a+m]

文件结果看起来像

file[0..a,a+1..a+n,a+n+1..a+m]
     ^  ^ ^      ^ ^        ^
     |FW| | BW   | |   PW   |