如何使用 Java 9+ 从 JDK 模块获取 类 的文件?
How to get files for classes from JDK modules with Java 9+?
我正在尝试将 java.base
中的 类 读取为 InputStream
s。我已经有一个方法来读取给定 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.toFile
或 classFile.toAbsolutePath.toFile
时,我得到一个 UnsupportedOperationException
,我猜这是因为它不是物理文件。但是,我需要一个 File
对象变成一个 InputStream
并读取。如何为属于 JDK 的某个模块(或每个模块)中的每个类文件获取 File
对象?
您不一定需要 File
来创建 InputStream
。您还可以将 Path
与 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) {
...
}
});
我正在尝试将 java.base
中的 类 读取为 InputStream
s。我已经有一个方法来读取给定 File
对象的类文件,但是我无法获得 File
对象,因为我使用的是 JDK 11 并且没有 rt.jar
文件了。按照
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.toFile
或 classFile.toAbsolutePath.toFile
时,我得到一个 UnsupportedOperationException
,我猜这是因为它不是物理文件。但是,我需要一个 File
对象变成一个 InputStream
并读取。如何为属于 JDK 的某个模块(或每个模块)中的每个类文件获取 File
对象?
您不一定需要 File
来创建 InputStream
。您还可以将 Path
与 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) {
...
}
});