P1 と P2 の 2 つのプロセスがあり、共有ファイルにアクセスするとしますFoo.txt
。
P2 が から読み取っているとしFoo.txt
ます。Foo.txt
P2がそれを読んでいる間にP1に書き込んでほしくありません。
そこで、P1 を に書き込みFoo.tmp
、最後のステップとして名前Foo.tmp
をに変更できると考えましたFoo.txt
。私のプログラミング言語は Java です
私の質問は、これにより、P2 が から正しいデータを読み取ることが保証されるのFoo.txt
でしょうか? P2 がファイルの読み取りを完了すると、名前変更操作はコミットされますか?
編集
このシナリオを次のように再現しようとしました。
私のP1コードは次のようなものです:
File tempFile = new File(path1);
File realFile = new File(path2);
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
for(int i=0;i<10000;i++)
writer.write("Hello World\n");
writer.flush();
writer.close();
tempFile.renameTo(realFile);
私のP2コードは次のとおりです。
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while(true) {
while((line=br.readLine())!=null){
System.out.println(line);
Thread.sleep(1000);
}
br.close();
}
私のサンプル共有ファイル:
Test Input
Test Input
Test Input
P1 と P2 をほぼ同時に開始しています (P2 が先に開始)。
したがって、私の理解によると、P1 が新しい Foo.txt を作成したとしても、P2 は既にそれを読み取っているため、BufferedReader を Foo.txt に再度開くまで、古い Foo.txt コンテンツを読み取る必要があります。
しかし実際にはTest Input
、入力から予想されるように、P2 は 3 回読み取りますが、その後、P1 によって書き込まれた新しいコンテンツを読み取ります。
P2 からの出力:
Test Input
Test Input
Test Input
Hello World
Hello World
Hello World
.
.
.
So it doesn't work as it should. Am I testing this scenario wrong? I feel like there's something I'm missing out.