我不知道有没有一个命令行工具可以做到这一点,但这并不意味着不存在这样的工具。不过,您可以编写一个快速的实用程序,在不到20行的代码中获取资源内容。
请注意,目前已实现的所有三种方法都从执行程序的JDK中读取资源。此外,您可以显然修改任一方法的代码以更好地满足您的需求,例如使它们更加“动态”(例如,接受命令行参数)。
使用资源API
一种选择是使用资源API:
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
var name = "/sun/net/www/content-types.properties";
try (var in = Object.class.getResourceAsStream(name)) {
in.transferTo(System.out);
}
}
}
注意: 在调用java.base
模块中的类上使用getResourceAsStream
方法。
然后你可以像下面这样运行它(利用“单一源文件”功能):
java --add-opens=java.base/sun.net.www=ALL-UNNAMED Main.java
使用ModuleReader
import java.io.IOException;
import java.lang.module.ModuleFinder;
public class Main {
public static void main(String[] args) throws IOException {
var name = "sun/net/www/content-types.properties";
var mod = ModuleFinder.ofSystem().find("java.base").orElseThrow();
try (var reader = mod.open();
var in = reader.open(name).orElseThrow()) {
in.transferTo(System.out);
}
}
}
通过这种方法,您不需要使用 --add-opens
参数。
使用 JRT 文件系统
第三个选项是使用 JRT 文件系统并像读取文件一样读取资源:
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws IOException {
var uri = URI.create("jrt:/java.base/sun/net/www/content-types.properties");
try (var in = Files.newInputStream(Path.of(uri))) {
in.transferTo(System.out);
}
}
}
使用此选项,您无需--add-opens
参数。