假设我有一个简单的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
。我可以确定在任何环境中都会这样吗?第一个实例写入的信息在哪里?
答案 0 :(得分:1)
您尚未在FileOutputStream的constructor中指定append=true
,因此最后一个要运行的进程(数字2)将覆盖前一个进程写入的内容。
关于写入文件的多个进程,您希望使用某种锁定来防止内容混合。 您可以使用FileLock。
请查看此answer以获取帮助。