【发布时间】:2020-02-05 19:05:21
【问题描述】:
我用 7-zip 打开了一个 .jmod 文件,我可以看到内容。我尝试以编程方式使用 ZipInputStream 读取它,但它不起作用:有人知道怎么做吗?
【问题讨论】:
标签: java module zip zipinputstream
我用 7-zip 打开了一个 .jmod 文件,我可以看到内容。我尝试以编程方式使用 ZipInputStream 读取它,但它不起作用:有人知道怎么做吗?
【问题讨论】:
标签: java module zip zipinputstream
JEP 261: Module System 中没有关于 JMOD 文件使用的格式的文档。据我所知,这不是疏忽,因为将格式保留为实现细节意味着他们可以随时更改格式,无需通知。话虽如此,目前 JMOD 文件似乎是以 ZIP 格式打包的; this other answer 引用 JEP 261 中的以下内容:
JMOD 文件的最终格式是一个开放的问题,但目前它基于 ZIP 文件。
但是,我在 JEP 261 的任何地方都找不到该引用。它看起来来自旧版本的规范——至少,我在 JDK-8061972(与 JEP 相关的问题)的历史中发现了类似的措辞。
这意味着您应该(暂时)能够使用任何允许读取 ZIP 文件的 API 来读取 JMOD 文件。例如,您可以使用以下之一:
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)。
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 文件使用的格式未记录在案,如有更改,恕不另行通知。
【讨论】: