我打开了一个7-zip的.jmod文件,可以看到其中的内容。我试图以编程方式使用ZipInputStream读取它,但是它不起作用:有人知道该怎么做吗?
有中没有文档JEP 261:模块系统有关的JMOD文件中使用的格式。据我所知,这不是疏忽,因为将格式保留为实现细节意味着他们可以随时更改格式,而无需另行通知。话虽如此,目前JMOD文件似乎以ZIP格式打包;这个其他答案引用了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)
。
该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文件使用的格式未记录在案,如有更改,恕不另行通知。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句