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

How to get files for classes from JDK modules with Java 9+?

我正在尝试将 java.base 中的 类 读取为 InputStreams。我已经有一个方法来读取给定 File 对象的类文件,但是我无法获得 File 对象,因为我使用的是 JDK 11 并且没有 rt.jar 文件了。按照 回答后,我大致有以下代码(我使用的是 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) {
    ...
  }
});