Java:为什么这会返回null?

时间:2009-11-23 01:43:58

标签: java

此代码确实返回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());
}

2 个答案:

答案 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()前面添加斜杠才能正常工作。

如果您可以将.cl​​ass文件作为资源获取,则在调用getResource()

时还需要将“.class”附加到类名称