为什么fileWriter在bufferedWriter和printWriter之前写入输出文件?
Why fileWriter is witten in the output file before bufferedWrite and printWriter?
我正在尝试一些 Java.io 类,例如 File、FileWriter、BufferedWriter 和 PrintWriter。
我不明白为什么 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 |
我正在尝试一些 Java.io 类,例如 File、FileWriter、BufferedWriter 和 PrintWriter。
我不明白为什么 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 |