Nat*_* W. 6 java io jar inputstream stream
我正在尝试使用流来迭代已知目录中的类文件.最终目标是获取特定包中存在的所有类的类名,然后在运行时加载类并使用反射来获取所有静态常量的名称和值.这工作,当我从源我的机器上运行的程序,但是当我运行它作为一个罐子的BufferedReader抛出,无论从NPE ready()和readLine().这是代码(为简洁起见,省略了错误处理和最佳实践):
private void printClassNamesInPackage(final String strPackage) throws Exception {
// The returned implementation of InputStream seems to be at fault
final InputStream packageStream = getClass().getClassLoader().getResourceAsStream( strPackage );
final InputStreamReader streamReader = new InputStreamReader( packageStream );
final BufferedReader reader = new BufferedReader( streamReader );
// Throws NPE from inside ready() - SEE STACKTRACE BELOW
// reader.ready()
String strLine;
// Throws NPE from inside readLine() - SEE STACKTRACE BELOW
while ( null != (strLine = reader.readLine()) ) {
System.out.println( strLine );
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪来自reader.ready():
java.lang.NullPointerException
at java.io.FilterInputStream.available(FilterInputStream.java:142)
at sun.nio.cs.StreamDecoder.inReady(StreamDecoder.java:343)
at sun.nio.cs.StreamDecoder.implReady(StreamDecoder.java:351)
at sun.nio.cs.StreamDecoder.ready(StreamDecoder.java:165)
at java.io.InputStreamReader.ready(InputStreamReader.java:178)
at java.io.BufferedReader.ready(BufferedReader.java:436)
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪来自reader.readLine():
java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
Run Code Online (Sandbox Code Playgroud)
单步执行会显示以下InputStream实现:
java.io.ByteArrayInputStreamsun.net.www.protocol.jar.JarURLConnection$JarURLInputStream展望进一步融入JarURLInputStream我发现继承(从FilterInputStream)字段InputStream in是null,这导致了导致NPE.
不幸的是,这就像我能够进入调试器一样深.
关于如何正确地做到这一点的任何想法?我错过了什么或做错了什么?谢谢!
文件夹不会返回InputStream包含所有文件或其他内容的某些列表。用于JarInputStream以编程方式提取 JAR。您可以在此处找到示例。作为参考,这里有一个稍微修改过的相关摘录:
public static List<String> getClassNamesInPackage(String jarName, String packageName) throws IOException {
JarInputStream jarFile = new JarInputStream(new FileInputStream(jarName));
packageName = packageName.replace(".", "/");
List<String> classes = new ArrayList<String>();
try {
for (JarEntry jarEntry; (jarEntry = jarFile.getNextJarEntry()) != null;) {
if ((jarEntry.getName().startsWith(packageName)) && (jarEntry.getName().endsWith(".class"))) {
classes.add(jarEntry.getName().replace("/", "."));
}
}
} finally {
jarFile.close();
}
return classes;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1847 次 |
| 最近记录: |