当我运行此测试时
public class Test extends Thread {
String str;
Test(String s) {
this.str = s;
}
@Override
public void run() {
try {
FileWriter fw = new FileWriter("1.txt", true);
for (char c : str.toCharArray()) {
System.out.print(c);
fw.write(c);
}
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new File("1.txt").delete();
new Test("11111111111111111111").start();
new Test("22222222222222222222").start();
}
}
它准确显示了如何将字符写入1.txt
2222222222222222111211111211111121211111
但在1.txt中我看到了不同的结果
2222222222222222222211111111111111111111
为什么会这样?
答案 0 :(得分:6)
中间缓冲区。通常现代OS缓冲文件写入一次写入完整扇区,以避免过多的硬盘驱动器头搜索,允许使用DMA技术等...
答案 1 :(得分:0)
这可能是 ASYNC I / O Write 的一个例子。
内核更新页面缓存中相应的进程(不同)页面并将其标记为脏(需要在HDD中更新)。然后控件快速返回到相应的进程(这里有2个不同的进程),这些进程可以按照调度程序调用的顺序继续在控制台中运行和更新。稍后以更优化的方式(顺序聚合写入)以更优的时间(低CPU负载)将数据刷新到HDD。因此顺序从过程区域写入。