我有一个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
会创建一个空文件,并使其可供系统中的其他进程使用。
在我的情况下,它会导致一个讨厌的错误,因为另一个进程可以以不一致的状态读取此文件(空)。
是否有可能使这个文件对其他进程不可见,直到创建它的进程完成它?可以在操作系统级别解决还是有其他解决方案?
答案 0 :(得分:3)
另一种方法是将文件存储为.tmp或其他命名约定,直到第一个进程完全完成,然后将其重命名为预期的提取名称。 在程序中还有其他更好的方法,但在StackOverflow中这是一个更好的答案。
答案 1 :(得分:1)
通过将文件权限设置为700(完全访问所有者,无权访问与所有者相同的组,无权访问其他用户),或者在创建文件时使用UMASK设置,可以使其他进程无法访问该文件。完成后,您可以启用对文件的访问。
在java中,您可以使用setPosixFilePermissions
来实现