2

我想知道如果我尝试在 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 文件读取,是否会受到影响?

4

2 回答 2

3

如果不同的进程正在处理您的文件,则 if(f.exists()) 逻辑不会对您有太大帮助:在它完成执行但在下一行执行之前,结果可能会有所不同。

如果文件的文件名在点//A 发生更改,您将根据FileReader 文档获得 FileNotFoundException 。如果文件被其他读者替换,则不应该注意到。

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

但是,同时修改文件是一个坏主意,应该避免。如果您试图找到一种让两个进程进行通信的方法,一个常见的选择是使用内存映射文件。同样,另一种解决方案可能会更合理。

于 2012-06-18T14:36:32.907 回答
3

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

于 2012-06-18T14:38:33.760 回答