您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
一位不愿透露姓名的用户 发布于2019年12月22日 15:54 最近更新于 2019年12月22日 18:59

如何通过 Java 代码修改文件的权限?

3763 次浏览 读完需要≈ 1 分钟 Java
问一个比较小白的问题,在Java中怎么编写代码来修改文件的读、写、执行权限呢?

1 个回答

Ready · 5年前

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异常。

已采纳 ? 0 0 0 编辑

撰写答案