在类 Unix 系统中,每个进程都有一个名为umask的属性,该属性被屏蔽到由子进程创建和继承的任何文件的权限上。默认是0002
或“关闭为他人写”。因此,Java 很可能正在设置您寻求的权限,然后将其屏蔽掉。您可以在创建文件后显式设置权限或在启动之前更改 java 进程的 umask 设置。
首先让我们看一下当前的umask:
arthur@a:/tmp$ umask
0002
然后让我们为每个人创建一个可以读写的文件(touch 和你的 java 代码一样)
arthur@a:/tmp$ touch foo
arthur@a:/tmp$ ls -l foo
-rw-rw-r-- 1 arthur arthur 0 Aug 28 13:58 foo
我们看到八进制0002
已被实际文件权限屏蔽。
所以我们可以通过将它设置为 0000 来移除这个 umask:
arthur@a:/tmp$ umask 0000
arthur@a:/tmp$ touch foo
我们看到 foo 在更新时保持原样,因为 umasks 仅适用于新文件。并使用 read-other 权限创建一个新的文件栏。
arthur@a:/tmp$ ls -l foo
-rw-rw-r-- 1 arthur arthur 0 Aug 28 14:00 foo
arthur@a:/tmp$ touch bar
arthur@a:/tmp$ ls -l bar
-rw-rw-rw- 1 arthur arthur 0 Aug 28 14:00 bar
我习惯于在 Java 中创建文件后显式设置权限,因为这更容易从系统传递到系统* 您可以通过在运行 emacs/your-program 之前在 shell 中设置 umask 并检查来证明这一点之后的文件权限。
*Java 是“一次编写,随处运行”对吧?