我想知道如果我尝试读取Java中可能被其他进程修改的文件会发生什么。例如,给定伪代码:
File f = new File("a");
if (f.exists()) {
// A
BufferedReader br = new BufferedReader(new FileReader(f));
// B
String line = "";
while ((line = br.readLine() ) != null ) {
// C
out.println(line);
}
}
如果在这些评论的地方(A / B / C),文件名已被另一个进程更改,会发生什么?如果文件被删除或替换为另一个文件,它会有所不同吗?如果实施了不同类型的od文件读取会对其中的任何一个产生影响吗?
答案 0 :(得分:3)
如果不同的进程正在触及你的文件,那么if(f.exists())逻辑对你没什么帮助:结果可能会在它完成执行时但在你的下一行之前有所不同。
如果文件的文件名在点// A处发生变化,那么您将根据FileReader documentation获得FileNotFoundException。如果文件被其他读者替换,则不应注意。
在此之后,您的VM应该控制该文件,并且大多数操作系统将阻止其他进程触及该文件。
同时修改文件是一个坏主意,应该避免。如果您正在尝试找到一种方法来获取两个进程进行通信,则常见的选择是使用内存映射文件。同样,另一种解决方案可能会更加健全。
答案 1 :(得分:3)
您可以而且应该通过删除exists()
测试并捕获FileNotFoundException,
来消除A点,一旦打开文件,它对您来说无关紧要,并且在某些操作上系统无法重命名打开的文件。此外,没有理由初始化'line'变量。