如何通过 Java 代码修改文件的权限?
1 个回答
Java 5-
在 Java 6 之前,Java 中没有自带可以修改文件权限的Java API的。
如果我们非要实现对文件权限的设置,我们可以编写C/C++的本地代码,以 JNI 的方式在Java代码中进行调用。或者我们也可以使用Runtime.exec()
方法调用系统的本地程序命令来解决,例如在Linux中,我们可以调用 chmod 命令。
Runtime.getRuntime().exec("chmod 755 /path/to/file");
Java 6+
从 Java 6 开始,Java 中新增了 java.io.File.canXxx() 和 java.io.File.setXxx() 系列API,用于对文件进行权限设置。
@Test
public void test(java.io.File file) {
// 检测
file.canRead(); // 检测文件是否可读( boolean值,下同 )
file.canWrite(); // 检测文件是否可写
file.canExecute(); // 检测文件是否可执行
// 设置
file.setReadable(true); // 设置所有者对文件具有可读权限
file.setReadable(true, false); // // 设置【所有人】对文件都具有可读权限(第二个参数 下同)
file.setWritable(true); // 设置所有者对文件具有可写权限
file.setExecutable(true); // 设置所有者对文件具有可执行权限
}
不过很遗憾的是,这些 API 只能设置文件的所有者 或 所有人对该文件的操作权限,并不能对所有者、所有组、其它进行细分的权限设置。
请注意:File.setXxx() 系列 API 只确保 所有者 或 所有人 的某个操作权限是按照你的要求来设置的,并不会先清除所有的权限设置、只保留你设置的这个权限设置。
例如在一个文件权限为"755"(即"rwxrw-rw-")执行file.setReadable(true)
,文件的权限还是"755",而不是"100"(即"r--------")。如果你想要将一个文件只设置具有"100"权限,你应该编写如下代码:
// 先清除所有可能存在的任何权限权限
file.setReadable(false, false);
file.setWritable(false, false);
file.setExecutable(false, false);
// 只为所有者设置可读权限
file.setReadable(true);
Java 7+
从 Java 7 开始,Java 在新增的java.nio.file包中又为我们带来了新的文件权限设置 API。
@Test
public void test(File file) throws IOException {
// 设置指定文件的权限为"777"模式,即所有人都可读、写、执行
Files.setPosixFilePermissions(file.toPath(), EnumSet.of(
PosixFilePermission.OWNER_READ,
PosixFilePermission.OWNER_WRITE,
PosixFilePermission.OWNER_EXECUTE,
PosixFilePermission.GROUP_READ,
PosixFilePermission.GROUP_WRITE,
PosixFilePermission.GROUP_EXECUTE,
PosixFilePermission.OTHERS_READ,
PosixFilePermission.OTHERS_WRITE,
PosixFilePermission.OTHERS_EXECUTE
));
}
当然,上面的代码看起来比较长,Java 也为我们提供了一种比较快捷的设置方式:
// 为所有者分配读+写+执行权限;为所有组分配读、写权限;为其它分配只读权限
Files.setPosixFilePermissions(file.toPath(), PosixFilePermissions.fromString("rwxrw-r--"));
不过,请一定要注意,这些新的API仅限于在支持 POSIX(可移植操作系统接口) 的文件系统中使用(例如 Linux),如果在 Windows 系统中执行上述代码,则会抛出java.lang.UnsupportedOperationException
异常。