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

use*_*ser 2 java java-11

我正在尝试从java.baseas 中读取类InputStream。我已经有一种方法可以读取给定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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*nee 6

您不一定需要 aFile来创建InputStream. 您还可以将 aPath与 一起使用Files::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) {
    ...
  }
});
Run Code Online (Sandbox Code Playgroud)