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

中間バッファー。通常、最新の OS バッファ ファイルは、ハード ドライブのヘッダー シークが多すぎるのを回避し、DMA 技術を使用できるようにするために、一度にセクタ全体を書き込むように書き込みます。

于 2013-08-29T12:00:15.127 に答える
0

これはASYNC I/O Writeの例かもしれません。

カーネルは、ページキャッシュ内の対応するプロセス (異なる) ページを更新し、ダーティとしてマークします (HDD で更新する必要があります)。その後、制御は対応するプロセス (ここでは 2 つの異なるプロセス) にすばやく戻り、スケジューラによって呼び出された順序でコンソールで実行および更新を続行できます。データは後で、より最適な方法で (順次一括書き込み)、より最適な時間 (低 CPU 負荷) に HDD にフラッシュされます。したがって、プロセス領域から順次書き込みます。

于 2013-08-29T12:08:04.940 に答える