同时从两个JVM写入文件

时间:2017-03-22 09:24:43

标签: java file unix

假设我有一个简单的Java程序,使用FileOutputStream(使用默认构造函数FileOutputStream(File))将某些内容写入某个文件,并且该程序的两个实例同时运行(并且它们都将相同的内容写入同一个文件),生成的文件是否有可能被破坏?

以下是我尝试的简单示例:

    public static void main(String[] args) throws IOException {
        String content = args[0] + "\n";
        long startTime = System.currentTimeMillis();
        FileOutputStream fos = new FileOutputStream(new File("/Users/user/tmp/file.txt"));
        while (System.currentTimeMillis() - startTime < TimeUnit.SECONDS.toMillis(30)) {
            fos.write(content.getBytes());
        }
        fos.close();
    }

在我的机器上,如果我运行带有1参数的此程序的一个实例,而第二个带有2参数的实例,我只能在结果文件中看到2。我可以确定在任何环境中都会这样吗?第一个实例写入的信息在哪里?

1 个答案:

答案 0 :(得分:1)

您尚未在FileOutputStream的constructor中指定append=true,因此最后一个要运行的进程(数字2)将覆盖前一个进程写入的内容。

关于写入文件的多个进程,您希望使用某种锁定来防止内容混合。 您可以使用FileLock

请查看此answer以获取帮助。