Предположим, что есть 2 процесса P1 и P2, и они обращаются к общему файлу Foo.txt
.
Предположим, что P2 читается с Foo.txt
. Я не хочу, чтобы P1 писал на Foo.txt
, а P2 читает его.
Итак, я думал, что могу записать 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 уже его читает, он должен прочитать старый контент Foo.txt, пока он не откроет BufferedReader в Foo.txt.
Но на самом деле P2 читает Test Input
трижды, как ожидается от ввода, но после этого он считывает новое содержимое, которое было написано P1.
Выход из P2:
Test Input
Test Input
Test Input
Hello World
Hello World
Hello World
.
.
.
Так что это не работает так, как должно. Я неправильно тестирую этот сценарий? Я чувствую, что там что-то не хватает.