Warm tip: This article is reproduced from serverfault.com, please click

cross platform-相当于java.io.File.setWritable()的java.nio.file.Files是什么?

(cross platform - What is the java.nio.file.Files equivalent of java.io.File.setWritable()?)

发布于 2020-11-29 16:42:10

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()方法。

https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#setAttribute(java.nio.file.Path,%20java.lang.String,%20java.lang。对象,%20java.nio.file.LinkOption ...)

Questioner
Graham Leggett
Viewed
0
rmunge 2020-11-30 03:45:40

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),则应选择文件属性视图。