读取Java中可能被其他进程修改的文件

时间:2012-06-18 14:22:31

标签: java java-io

我想知道如果我尝试读取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文件读取会对其中的任何一个产生影响吗?

2 个答案:

答案 0 :(得分:3)

如果不同的进程正在触及你的文件,那么if(f.exists())逻辑对你没什么帮助:结果可能会在它完成执行时但在你的下一行之前有所不同。

如果文件的文件名在点// A处发生变化,那么您将根据FileReader documentation获得FileNotFoundException。如果文件被其他读者替换,则不应注意。

在此之后,您的VM应该控制该文件,并且大多数操作系统将阻止其他进程触及该文件。

同时修改文件是一个坏主意,应该避免。如果您正在尝试找到一种方法来获取两个进程进行通信,则常见的选择是使用内存映射文件。同样,另一种解决方案可能会更加健全。

答案 1 :(得分:3)

您可以而且应该通过删除exists()测试并捕获FileNotFoundException,来消除A点,一旦打开文件,它对您来说无关紧要,并且在某些操作上系统无法重命名打开的文件。此外,没有理由初始化'line'变量。