是否有可能文件对其他进程不可见?

时间:2016-10-19 17:24:18

标签: linux shell

我有一个Java应用程序,它从shell脚本调用并创建一个文件,然后将一些内容写入其中。它的工作原理如下:

File f = new File("/tmp/NEW_t.zip");
try(FileOutputStream fos = new FileOutputStream(f);
    Writer writer = new OutputStreamWriter(fos)){
  writer.write("Test string");
  writer.write("another test string");
  //lots of other writings

生成的文件非常大(最多100MB)。问题是打开FileOutputStream会创建一个空文件,并使其可供系统中的其他进程使用。

在我的情况下,它会导致一个讨厌的错误,因为另一个进程可以以不一致的状态读取此文件(空)。

是否有可能使这个文件对其他进程不可见,直到创建它的进程完成它?可以在操作系统级别解决还是有其他解决方案?

2 个答案:

答案 0 :(得分:3)

另一种方法是将文件存储为.tmp或其他命名约定,直到第一个进程完全完成,然后将其重命名为预期的提取名称。 在程序中还有其他更好的方法,但在StackOverflow中这是一个更好的答案。

答案 1 :(得分:1)

通过将文件权限设置为700(完全访问所有者,无权访问与所有者相同的组,无权访问其他用户),或者在创建文件时使用UMASK设置,可以使其他进程无法访问该文件。完成后,您可以启用对文件的访问。

在java中,您可以使用setPosixFilePermissions

来实现