【问题标题】:Is there a way to read programmatically a .jmod file in Java?有没有办法以编程方式读取 Java 中的 .jmod 文件?
【发布时间】:2020-02-05 19:05:21
【问题描述】:

我用 7-zip 打开了一个 .jmod 文件,我可以看到内容。我尝试以编程方式使用 ZipInputStream 读取它,但它不起作用:有人知道怎么做吗?

【问题讨论】:

    标签: java module zip zipinputstream


    【解决方案1】:

    JEP 261: Module System 中没有关于 JMOD 文件使用的格式的文档。据我所知,这不是疏忽,因为将格式保留为实现细节意味着他们可以随时更改格式,无需通知。话虽如此,目前 JMOD 文件似乎是以 ZIP 格式打包的; this other answer 引用 JEP 261 中的以下内容:

    JMOD 文件的最终格式是一个开放的问题,但目前它基于 ZIP 文件。

    但是,我在 JEP 261 的任何地方都找不到该引用。它看起来来自旧版本的规范——至少,我在 JDK-8061972(与 JEP 相关的问题)的历史中发现了类似的措辞。

    这意味着您应该(暂时)能够使用任何允许读取 ZIP 文件的 API 来读取 JMOD 文件。例如,您可以使用以下之一:

    1. java.util.zip API:

      import java.io.File;
      import java.io.IOException;
      import java.util.zip.ZipFile;
      
      public class Main {
      
        public static void main(String[] args) throws IOException {
          var jmodFile = new File(args[0]).getAbsoluteFile();
          System.out.println("Listing entries in JMOD file: " + jmodFile);
      
          try (var zipFile = new ZipFile(jmodFile)) {
            for (var entries = zipFile.entries(); entries.hasMoreElements(); ) {
              System.out.println(entries.nextElement());
            }
          }
        }
      }
      

      注意:要阅读条目的内容,请参阅ZipFile#getInputStream(ZipEntry)。

    2. ZIP FileSystemProvider API:

      import java.io.IOException;
      import java.nio.file.FileSystems;
      import java.nio.file.Files;
      import java.nio.file.Path;
      
      public class Main {
      
        public static void main(String[] args) throws IOException {
          var jmodFile = Path.of(args[0]).toAbsolutePath().normalize();
          System.out.println("Listing entries in JMOD file: " + jmodFile);
      
          try (var fileSystem = FileSystems.newFileSystem(jmodFile)) {
            Files.walk(fileSystem.getRootDirectories().iterator().next())
                .forEachOrdered(System.out::println);
          }
        }
      }
      

      注意:要读取条目的内容,请使用java.nio.file.Files 类提供的众多方法之一。

      注意:Path#of(String,String...) 方法是在 Java 11 中添加的,FileSystems#newFileSystem(Path) 方法是在 Java 13 中添加的。如果使用旧版本的Java。


    不过,重申一下:JMOD 文件使用的格式未记录在案,如有更改,恕不另行通知。

    【讨论】:

    • 非常感谢,通过 ZipFile 我解决了,而不是通过 ZipInputStream 它不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多