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

Posted

技术标签:

【中文标题】什么是 java.io.File.setWritable() 的 java.nio.file.Files 等价物?【英文标题】:What is the java.nio.file.Files equivalent of java.io.File.setWritable()? 【发布时间】:2021-03-11 17:23:18 【问题描述】:

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...)

【问题讨论】:

【参考方案1】:

NIO 扩展了 Java 的 IO,但它并不能完全替代现有的类。 java.io.File 类也被弃用。对于java.io.File.setWritable()java.nio.file.Files 内没有等价物。正如之前的回答中已经提到的,您仍然可以将 Path 对象转换为 File 对象并调用setWritable

NIO 引入了文件属性视图的概念,并允许访问例如访问控制列表 (ACL) 和用户定义的文件属性。例如。在 Windows 上 setWritable 仅对只读标志(文件资源管理器中的第一个选项卡)有影响,但对 ACL 没有影响(请参阅文件资源管理器中的安全选项卡)。即使你调用file.setWritable(false),所有者仍然有写入权限,但由于设置了只读标志,最终无法写入。

由于并非所有操作系统都与 POSIX 兼容(向雷德蒙德致敬;-)并非所有文件属性视图都可在所有操作系统上使用。以下代码或多或少与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权限模型缺乏良好的字符串表示使得在配置文件中设置跨平台尊重权限变得棘手。感谢您的全面回答。【参考方案2】:

在路径的关联文件对象上使用“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);
      
    

【讨论】:

以上是关于什么是 java.io.File.setWritable() 的 java.nio.file.Files 等价物?的主要内容,如果未能解决你的问题,请参考以下文章

时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?

什么是拉电流,什么是灌电流?什么是吸收电流 ?

在java中,OOA是什么?OOD是什么?OOP是什么?

什么是DIV,全称是什么?

什么是抢占/什么是可抢占内核?到底有什么好处呢?

什么是 JNDI?它的基本用途是什么?什么时候使用?