有 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对象


共 (1) 个答案

  1. # 1 楼答案

    创建InputStream不一定需要File。您还可以将Path^{}一起使用:

    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) {
        ...
      }
    });