模块 jdk.zipfs


模块jdk.zipfs
提供 Zip 文件系统提供程序的实现。 Zip 文件系统提供程序将 Zip 或 JAR 文件的内容视为文件系统。

访问 Zip 文件系统

FileSystems newFileSystem 静态工厂方法可用于:
  • 创建 Zip 文件系统
  • 打开现有文件作为 Zip 文件系统
Zip 文件系统提供程序不支持打开包含带有“.”的条目的现有 Zip 文件。或“..”在其名称元素中。

用于识别 Zip 文件系统的 URI 方案

标识 ZIP 文件系统的 URI scheme jar

POSIX 文件属性

Zip 文件系统支持名为“zip”的文件属性view ,它定义了以下文件属性:
支持的属性
Name Type
permissions Set <PosixFilePermission >
“权限”属性是为 Zip 文件中的条目选择性存储的一组访问权限。对于没有访问权限的条目,该属性的值为null。 Zip 文件系统不强制执行访问权限。

可以使用 Files.getAttributeFiles.setAttribute 方法读取和设置“权限”属性。以下示例使用这些方法来读取和设置属性:

 
   Set<PosixFilePermission> perms = Files.getAttribute(entry, "zip:permissions");
   if (perms == null) {
     perms = PosixFilePermissions.fromString("rw-rw-rw-");
     Files.setAttribute(entry, "zip:permissions", perms);
   }
  

除了“zip”视图之外,Zip 文件系统还可以选择支持 PosixFileAttributeView (“posix”)。此视图扩展了“basic”视图,具有对 owner group-owner permissions 属性的类型安全访问。 “posix”视图仅在 Zip 文件系统创建时提供程序属性“enablePosixFileAttributes”设置为“true”时才受支持。下面创建一个具有此属性的文件系统并读取文件的访问权限:

 
   var env = Map.of("enablePosixFileAttributes", "true");
   try (FileSystem fs = FileSystems.newFileSystem(file, env) {
     Path entry = fs.getPath("entry");
     Set<PosixFilePermission> perms = Files.getPosixFilePermissions(entry);
   }
  

文件所有者和组所有者属性不会持久化,这意味着它们不会存储在 zip 文件中。 “defaultOwner”和“defaultGroup”提供程序属性(在下面列出)可用于配置这些属性的默认值。如果未设置这些属性,则文件所有者默认为 zip 文件的所有者,组所有者默认为 zip 文件的组所有者(或不支持组所有者的平台上的文件所有者)。

permissions”属性在“posix”视图中不是可选的,因此一组默认权限用于没有存储在 Zip 文件中的访问权限的条目。默认权限集是

可以使用下面描述的“defaultPermissions”属性配置默认权限。

Zip 文件系统属性

创建 Zip 文件系统时可以指定以下属性:
创建新 Zip 文件系统时可以指定的可配置属性
属性名称 数据类型 默认值 Description
create String Boolean false 如果值为 true ,Zip 文件系统提供程序会创建一个新的 Zip 或 JAR 文件(如果它不存在)。
编码 String UTF-8 该值指示 Zip 或 JAR 文件中条目名称的编码方案。
enablePosixFileAttributes String Boolean false 如果值为 true ,Zip 文件系统将支持 PosixFileAttributeView
defaultOwner UserPrincipal
或者String
null/unset 重写 Zip 文件系统中条目的默认所有者。
该值可以是 UserPrincipal 或用作 UserPrincipal 名称的字符串值。
defaultGroup GroupPrincipal
或者String
null/unset 重写 Zip 文件系统中条目的默认组。
该值可以是 GroupPrincipal 或用作 GroupPrincipal 名称的字符串值。
defaultPermissions Set <PosixFilePermission >
或者String
null/unset 重写 Zip 文件系统中条目的默认权限集。
该值可以是 Set <PosixFilePermission > 或
PosixFilePermissions::fromString 解析的字符串
compressionMethod String "DEFLATED" 表示将条目写入 Zip 文件系统时使用的压缩方法的值。
  • 如果值为 "STORED" ,则 Zip 文件系统提供程序在写入 Zip 文件系统时不会压缩条目。
  • 如果值为 "DEFLATED" 或未设置该属性,Zip 文件系统提供程序将在将条目写入 Zip 文件系统时使用数据压缩。
  • 如果该值不是 "STORED""DEFLATED" ,则在创建 Zip 文件系统时将抛出 IllegalArgumentException
releaseVersion String Integer null/unset 表示访问 多版本 JAR 时要使用的版本条目的值。如果 JAR 不是 多版本 JAR ,该值将被忽略并且 JAR 将被视为未版本化。

该值必须是字符串“runtime”或代表有效的 Java SE 平台版本号 ,例如 914 ,以确定版本条目。

  • 如果值为 null 或未设置属性,则 JAR 将被视为未版本化的 JAR。
  • 如果值为 "runtime" ,版本条目将通过调用 Runtime.Version.feature() 来确定。
  • 如果该值不代表有效的 Java SE 平台版本号 ,将抛出 IllegalArgumentException

示例:

构造一个由 URI 标识的新 Zip 文件系统。如果 Zip 文件不存在,将创建它:
 

   URI uri = URI.create("jar:file:/home/luckydog/tennisTeam.zip");
   Map<String, String> env = Map.of("create", "true");
   FileSystem zipfs = FileSystems.newFileSystem(uri, env);
  
 
构造一个新的 Zip 文件系统,该文件系统通过指定路径和使用自动文件类型检测来识别。从显示每个找到的条目的 JAR 的根开始迭代:
 

   FileSystem zipfs = FileSystems.newFileSystem(Path.of("helloworld.jar"));
   Path rootDir = zipfs.getPath("/");
   Files.walk(rootDir)
      .forEach(System.out::println);
  
 
模块图:
Module graph for jdk.zipfsModule graph for jdk.zipfs
自从:
9