此代码确实返回null InputStream以及null URL。这是为什么?我有自己的类,我希望将实际的 .class文件作为InputStream序列化为bytes []。
Class clazz = String.class;
String className = clazz.getName(); System.out.println(className);
URL url = clazz.getResource(className);
if( url != null )
{
String pathName = url.getPath(); System.out.println(className);
}
InputStream inputStream = clazz.getResourceAsStream(className);
if(inputStream != null )
{
System.out.println(inputStream.available());
}
答案 0 :(得分:3)
首先,您需要上下文的类加载器。其次,您需要使用正斜杠.
替换classname中的点/
,并使用.class
扩展名后缀来标识真实路径。
所以这个应该有效:
String name = String.class.getName().replace(".", "/") + ".class";
URL url = Thread.currentThread().getContextClassLoader().getResource(name);
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
修改:我应该添加,inputStream.available()
不了解文件大小的方法。它只返回可用于读取而没有阻塞的字节数。换句话说,永远不应将返回值视为一致。如果你想获得实际长度,你真的需要阅读整个流。
答案 1 :(得分:0)
首先,我不确定你是否可以将实际的.class文件作为资源。
其次getName()
将包含该包,如果它不是以斜杠开头,则调用Class.getResource()
将假定该路径是相对于该类的。
您需要使用斜杠替换类名中的'。',并在getResource()
前面添加斜杠才能正常工作。
如果您可以将.class文件作为资源获取,则在调用getResource()