java.io.File.setWritable() 的 java.nio.file.Files 等价物是什么?

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

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.Object,%20java.nio.file.LinkOption...)

在路径的关联文件对象上使用 'setWritable':

    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;

    public class Permissions {
      public static void main(String[] args) throws Exception {
        Path current = Paths.get(".");
        Path path = Files.createFile(current.resolve("permissions.txt"));
        path.toFile().setWritable(true, false);
      }
    }

NIO 扩展了 Java 的 IO,但它并不是现有 classes 的完全替代。 java.io.File class 也 弃用。对于 java.io.File.setWritable()java.nio.file.Files 中没有对应项。正如前面的答案中已经提到的,您仍然可以将 Path 对象转换为 File 对象并调用 setWritable.

NIO 引入了文件属性视图的概念,并允许访问例如访问控制列表 (ACL) 和用户定义的文件属性。例如。 on Windows setWritable 仅对只读标志(文件资源管理器中的第一个选项卡)有影响,但对 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。它很简单,您不必关心操作系统/支持的文件属性视图。如果您需要更多(例如更改文件的所有者/组或 read/change ACL)文件属性视图应该是您的选择。