Module  java.base
软件包  java.io

Class FilePermission

  • All Implemented Interfaces:
    SerializableGuard


    public final class FilePermission
    extends Permission
    implements Serializable
    此类表示访问文件或目录。 FilePermission由路径名和对该路径名有效的一组操作组成。

    路径名是授予指定操作的文件或目录的路径名。 以“/ *”结尾的路径名(其中“/”是文件分隔符, File.separatorChar )表示该目录中包含的所有文件和目录。 以“/ - ”结尾的路径名表示(递归)该目录中包含的所有文件和子目录。 这样的路径名称为通配符路径名。 否则,它是一个简单的路径名。

    由特殊令牌“<<所有文件>>”组成的路径名匹配任何文件。

    注意:由单个“*”组成的路径名表示当前目录中的所有文件,而由单个“ - ”组成的路径名表示当前目录中的所有文件,并递归地显示当前目录中包含的所有文件和子目录目录。

    要授予的操作将以包含一个或多个以逗号分隔的关键字的列表的字符串的形式传递给构造函数。 可能的关键字是“读取”,“写入”,“执行”,“删除”和“读取链接”。 其含义定义如下:

    读权限
    写许可
    执行
    执行权限 允许Runtime.exec 对应SecurityManager.checkExec
    删除
    删除权限。 允许File.delete 对应SecurityManager.checkDelete
    的readlink
    阅读链接权限 允许通过调用readSymbolicLink 方法读取symbolic link的目标。

    操作字符串在处理之前转换为小写。

    授予FilePermissions时要小心。 考虑授予读取和特别写入访问各种文件和目录的含义。 使用写入操作的“<<所有文件>>”权限特别危险。 这允许写入整个文件系统的权限。 有效的一件事是更换系统二进制文件,包括JVM运行时环境。

    请注意:代码可以随时从同一目录中读取文件(或该目录的子目录); 它不需要明确的许可这样做。

    从以下版本开始:
    1.2
    另请参见:
    PermissionPermissionsPermissionCollection
    • 构造方法详细信息

      • FilePermission

        public FilePermission​(String path,
                              String actions)
        使用指定的操作创建一个新的FilePermission对象。 path是文件或目录的路径名, 操作包含在文件或目录上授予的所需操作的逗号分隔列表。 可能的操作是“读取”,“写入”,“执行”,“删除”和“读取链接”。

        以“/ *”结尾的路径名(其中“/”是文件分隔符, File.separatorChar )表示该目录中包含的所有文件和目录。 以“/ - ”结尾的路径名表示(递归)该目录中包含的所有文件和子目录。 特殊路径名“<<所有文件>>”匹配任何文件。

        由单个“*”组成的路径名表示当前目录中的所有文件,而由单个“ - ”组成的路径名表示当前目录中的所有文件,并递归地显示当前目录中包含的所有文件和子目录。

        包含空字符串的路径名表示空的路径。

        Implementation Note:
        在这个实现中, jdk.io.permissionsUseCanonicalPath系统属性指示如何处理和存储path参数。

        如果系统属性的值设置为truepath规范化并存储为名为cpath的String对象。 这意味着将相对路径转换为绝对路径,将Windows DOS风格的8.3路径扩展为长路径,并将符号链接解析为其目标等。

        如果系统属性的值被设置为falsepath被转换为Path命名对象npathnormalization 不执行规范化,这意味着底层文件系统不被访问。 如果在转换期间抛出InvalidPathException ,则该FilePermission将被标记为无效。

        在任一种情况下,在通配符path的末尾处的“*”或“ - ”字符在规范化或归一化之前被删除。 它存储在单独的通配符标志字段中。

        该默认值jdk.io.permissionsUseCanonicalPath系统属性为false在此实现。

        参数
        path - 文件/目录的路径名。
        actions - 动作字符串。
        异常
        IllegalArgumentException - 如果操作为 nullnull空或包含除指定的可能操作之外的操作。
    • 方法详细信息

      • implies

        public boolean implies​(Permission p)
        检查此FilePermission对象是否“暗示”指定的权限。

        更具体地说,这个方法返回true:

        • p是FilePermission的一个实例,
        • p的动作是这个对象的动作的一个子集,
        • p的路径名由该对象的路径名隐含。 例如,“/ tmp / *”意味着“/ tmp / foo”,因为“/ tmp / *”包含“/ tmp”目录中的所有文件,包括名为“foo”的文件。

        确切地说,一个简单的路径名意味着另一个简单的路径名,当且仅当它们相等时。 一个简单的路径名不会暗示通配符路径名。 通配符路径名意味着另一个通配符路径名,如果且仅当后者隐含的所有简单路径名都由前者隐含。 通配符路径名表示一个简单的路径名,如果且仅当它们

        • 如果通配符标志为“*”,则简单路径名的路径必须在通配符路径名的路径内。
        • 如果通配符标志为“ - ”,则简单路径名的路径必须在通配符路径名的路径中递归。

        “<<所有文件>>”意味着每个其他路径名。 没有路径名,除了“<<所有文件>>”本身,意味着“<<所有文件>>”。

        Specified by:
        impliesPermission
        Implementation Note:
        如果jdk.io.permissionsUseCanonicalPathtrue ,一个简单的cpath在通配符cpath内部,当且仅当从前者中删除基本名称(路径名称序列中的最后一个名称)时,其余部分等于后者,则简单的cpath在通配符cpath当且仅当前者从后者开始。

        如果jdk.io.permissionsUseCanonicalPathfalse ,一个简单的npath在通配符npath内部,如果且仅当simple_npath.relativize(wildcard_npath)完全是“..”,一个简单的npath递归地在通配符npath当且仅当simple_npath.relativize(wildcard_npath)是一系列一个或多个“..” 。 这意味着“/ - ”意味着“/ foo”,而不是“foo”。

        无效FilePermission并不意味着除了本身以外的任何对象。 无效FilePermission不包括任何对象,除了自身或“<<所有文件>>”上的FilePermission ,其操作是此无效FilePermission的超集。 即使使用相同的无效路径创建两个FilePermission ,也不意味着另一个。

        参数
        p - 允许检查。
        结果
        true如果指定的权限不是 null并且被该对象暗示,否则为 false
      • equals

        public boolean equals​(Object obj)
        检查两个FilePermission对象是否相等。 检查obj是否是FilePermission,并且具有与该对象相同的路径名和操作。
        Specified by:
        equalsPermission
        Implementation Note:
        更具体地说,当且仅当它们具有相同的通配符标志和它们的cpath (如果jdk.io.permissionsUseCanonicalPathtrue )或npath (如果jdk.io.permissionsUseCanonicalPathfalse )相等则两个路径名相同。 或者他们都是“<<所有文件>>”。

        jdk.io.permissionsUseCanonicalPathfalse ,无效的FilePermission与自身之外的任何对象不相等,即使使用相同的无效路径创建。

        参数
        obj - 我们正在测试与此对象相等的对象。
        结果
        true如果obj是一个的FilePermission,并且具有相同的路径名和动作,因为这的FilePermission对象, false否则。
        另请参见:
        Object.hashCode()HashMap
      • getActions

        public String getActions​()
        返回动作的“规范字符串表示”。 也就是说,该方法总是按照以下顺序返回当前动作:read,write,execute,delete,readlink。 例如,如果此FilePermission对象允许写入和读取操作,则调用getActions将返回字符串“读取,写入”。
        Specified by:
        getActionsPermission
        结果
        规范字符串表示的动作。
      • newPermissionCollection

        public PermissionCollection newPermissionCollection​()
        返回一个新的PermissionCollection对象,用于存储FilePermission对象。

        必须以允许以任何顺序将它们插入到集合中的方式存储FilePermission对象,但这也允许以有效(一致)的方式实现PermissionCollection implies方法。

        例如,如果您有两个FilePermissions:

        1. "/tmp/-", "read"
        2. "/tmp/scratch/foo", "write"

        您正在使用FilePermission调用implies方法:

          "/tmp/scratch/foo", "read,write", 
        那么implies函数必须考虑“/ tmp / - ”和“/ tmp / scratch / foo”权限,因此有效权限为“读,写”,而implies返回true。 FilePermissions的“暗示”语义由该newPermissionCollection方法返回的PermissionCollection对象正确处理。
        重写:
        newPermissionCollectionPermission
        结果
        适用于存储FilePermissions的新PermissionCollection对象。