我感到困惑...根据这个Java页面,File.setReadOnly()
函数现在已成为“遗留”函数,应该用Files.setAttribute()
来替代...但是这需要你知道你是否正在使用DOS或POSIX文件系统。我只想以一种平台无关的方式使文件只读。我该怎么做?
我感到困惑...根据这个Java页面,File.setReadOnly()
函数现在已成为“遗留”函数,应该用Files.setAttribute()
来替代...但是这需要你知道你是否正在使用DOS或POSIX文件系统。我只想以一种平台无关的方式使文件只读。我该怎么做?
我认为Oracle之所以称它们为“传统方法”,是因为有了新的java.nio.file API。如果他们真的想要阻止使用它们,他们就会弃用这些方法。
但是,如果您仍然想使用NIO2,比如为了保持一致性,您可以查询平台的底层FileStore
,了解是否支持DOS或POSIX属性。
Path file = Paths.get("file.txt");
// Files.createFile(file);
System.out.println(Files.isWritable(file)); // true
// Query file system
FileStore fileStore = Files.getFileStore(file);
if (fileStore.supportsFileAttributeView(DosFileAttributeView.class)) {
// Set read-only
Files.setAttribute(file, "dos:readonly", true);
} else if (fileStore.supportsFileAttributeView(PosixFileAttributeView.class)) {
// Change permissions
}
System.out.println(Files.isWritable(file)); // false
还有FileAttributeView
类,您可以使用它们轻松地更新多个属性。
DosFileAttributeView attrs =
Files.getFileAttributeView(
file, DosFileAttributeView.class);
attrs.setSystem(true);
attrs.setHidden(true);
attrs.setReadOnly(true);
dos:readonly
这样的属性在哪里有文档记录吗? - Garret Wilsonjava.nio.file.attribute.DosFileAttributeView
找到了它们。 - Garret WilsonFileStore.supportsFileAttributeView(...)
可能无法正确返回非本地文件系统的结果;请参阅我提出的问题"Java中获取DOS文件属性的类型保证"的答案。 - Garret Wilson