java - 如何使用 Java 9+ 从 JDK 模块获取类的文件?

我正在尝试从 java.base 中读取类作为 InputStream。我已经有一个方法来读取给定 File 对象的类文件,但我无法获得 File 对象,因为我使用的是 JDK 11 并且没有 rt.jar 文件了。关注this后答案,我大致有以下代码(我使用的是 Scala,但这本质上是一个关于 Java 的问题,因此有标签):

val fs = FileSystems.newFileSystem(URI.create("jrt:/"), Collections.emptyMap, loader)

Files.list(fs.getPath("/modules")).forEach { mdl =>
  Files.walk(mdl).forEach { (classFile: Path) =>
    val asFile = classFile.toAbsolutePath.toFile //Here's where I get an exception
    //do stuff with that
  }
}

不幸的是,当我使用 classFile.toFileclassFile.toAbsolutePath.toFile 时,我得到一个 UnsupportedOperationException,我猜这是因为它是不是物理文件。但是,我需要将一个 File 对象转换为一个 InputStream 并读取。如何为 JDK 的某个模块(或每个模块)中的每个类文件获取 File 对象?

最佳答案

您不一定需要 File 来创建 InputStream。您还可以将 PathFiles::newInputStream 一起使用:

Files.list(fs.getPath("/modules")).forEach(mdl -> {
  try(Stream<Path> stream = Files.walk(mdl)) {
    stream.forEach(classFile -> {
      try (InputStream input = Files.newInputStream(classFile)) {
        ...
      } catch(IOException e) {
        ...
      }
    });
  } catch(IOException e) {
    ...
  }
});

https://stackoverflow.com/questions/67610154/

相关文章:

python - 无需替换即可生成置换数组

kubernetes - Helm : How to avoid recreating secret

java - 如何断言数组中某个值的存在

java - 如何使用 Arrays.asList() 启动 LinkedList

android - Jetpack 撰写 : Textfield and FAB not using

c# - 在不使用 lambda 表达式的情况下从该方法传递额外参数时在方法内部订阅事件

python - 如何从 yfinance 数据中删除时区?

c++ - 为什么 C++ 中 std::string 的复制方法在此程序中显示出奇怪的行为?

Pandas - 提取第 4 个字符后的所有文本

python - 在新列中计算数据框中的逗号分隔字符串