【问题标题】:Reading files in Java which might be modified by another process在Java中读取可能被另一个进程修改的文件
【发布时间】:2012-06-18 14:22:30
【问题描述】:

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

【问题讨论】:

  • 其他进程是你可以控制的吗? (是你写的可以修改的代码吗?)
  • 通常操作系统不会让进程 A 修改进程 B 打开的文件。此外,如果您想这样做,请检查进程间通信/同步,以便 N 个进程可以安全地修改相同的数据结构。

标签: java java-io


【解决方案1】:

您可以而且应该通过删除 exists() 测试并捕获 FileNotFoundException, 来消除 A 点重命名打开的文件。此外,没有理由初始化 'line' 变量。

【讨论】:

    【解决方案2】:

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

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

    此时,您的虚拟机应该可以控制该文件,并且大多数操作系统会阻止其他进程接触该文件。

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

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多