2

当我运行这个测试

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

这是为什么?

4

2 回答 2

6

中间缓冲区。通常现代操作系统缓冲区文件写入一次写入整个扇区,以避免过多的硬盘头寻道,允许使用 DMA 技术等......

于 2013-08-29T12:00:15.127 回答
0

这可能是ASYNC I/O Write的一个示例。

内核更新页面缓存中相应的进程(不同)页面并将它们标记为脏(需要在 HDD 中更新)。然后控制快速返回到相应的进程(这里是2个不同的进程),该进程可以在控制台中按照调度程序调用的顺序继续运行和更新。稍后在更优化的时间(低 cpu 负载)以更优化的方式(顺序成束写入)将数据刷新到 HDD。因此从进程区域顺序写入。

于 2013-08-29T12:08:04.940 回答