读取Java中可能被其他进程修改的文件
我想知道如果我尝试读取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文件读取,会不会影响这些
# 1 楼答案
您可以而且应该通过删除
exists()
测试并捕获FileNotFoundException,
来消除点A,一旦打开文件,它的名称对您来说并不重要,在某些操作系统上,无法重命名打开的文件。此外,没有理由初始化“line”变量# 2 楼答案
如果不同的进程正在接触您的文件,If(f.exists())逻辑将不会对您有多大帮助:当它完成执行时,但在下一行执行之前,结果可能会有所不同
如果文件的文件名在//A点更改,您将根据FileReader documentation得到一个FileNotFoundException。如果该文件被另一个读者替换,则不应注意
在这一点之后,您的VM应该可以控制该文件,大多数OSs将阻止其他进程接触该文件
但是,并发修改文件是个坏主意,应该避免。如果您试图找到一种让两个进程通信的方法,一个常见的选择是使用内存映射文件。同样,另一个解决方案可能会更加合理