该java.io.File.setWritable()
方法允许你将文件设置为以平台无关的方式对支持此文件的文件系统上的每个人都可写。
https://docs.oracle.com/javase/7/docs/api/java/io/File.html#setWritable(boolean,%20boolean)
什么使java.nio.file.Path
对象具有等效行为?
静态方法java.nio.file.Files.setAttribute()
意味着可以设置权限,
但是,没有一组明确的参数可以模拟该java.io.File.setWritable()
方法。
NIO扩展了Java的IO,但它不能完全替代现有的类。该 java.io.File
班也不会过时。因为java.io.File.setWritable()
内没有等效项java.nio.file.Files
。如前面的答案中已经提到的,你仍然可以将Path对象转换为File对象并调用setWritable
。
NIO引入了文件属性视图的概念,并允许访问例如访问控制列表(ACL)和用户定义的文件属性。例如,在WindowssetWritable
上,仅对只读标志(文件资源管理器中的第一个选项卡)有影响,而对ACL没有影响(请参见文件资源管理器中的安全性选项卡)。即使你打电话file.setWritable(false)
,由于设置了只读标志,所有者仍然具有写权限,但最终无法写。
由于并非所有操作系统都兼容POSIX(向Redmond致意;-),因此并非所有文件属性视图在所有操作系统上都可用。以下代码或多或少与以下代码相同java.io.File.setWritable
:
public static boolean setWriteable(Path path, boolean writeable) {
try {
PosixFileAttributeView posix = Files.getFileAttributeView(path, PosixFileAttributeView.class);
if (posix != null) {
// POSIX
Set<PosixFilePermission> permissions = new HashSet<>(posix.readAttributes().permissions());
boolean changed = false;
if (writeable) {
changed = permissions.add(PosixFilePermission.OWNER_WRITE);
} else {
changed = permissions.remove(PosixFilePermission.OWNER_WRITE);
}
if (changed) {
posix.setPermissions(permissions);
}
return true;
} else {
// Windows - does not support POSIX file permission view
DosFileAttributeView dos = Files.getFileAttributeView(path, DosFileAttributeView.class);
if (dos != null) {
dos.setReadOnly(!writeable);
}
return true;
}
} catch (IOException e) {
return false;
}
}
因此,如果你只想更改文件的只读标志,我将继续使用File.setWritable
。它很简单,你不必关心操作系统/支持的文件属性视图。如果你需要更多信息(例如,更改文件的所有者/组或读取/更改ACL),则应选择文件属性视图。
我担心情况就是如此。Java权限模型缺乏良好的字符串表示形式,这使得在配置文件中设置跨平台的尊重权限变得棘手。感谢您的全面答复。