24

P1 と P2 の 2 つのプロセスがあり、共有ファイルにアクセスするとしますFoo.txt

P2 が から読み取っているとしFoo.txtます。Foo.txtP2がそれを読んでいる間に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.

4

3 に答える 3

5

なぜ使用しないのFileChannel.lockですか?

以下に例を示します。

http://examples.javacodegeeks.com/core-java/nio/filelock/create-shared-file-lock-on-file/

于 2013-09-09T20:29:33.020 に答える