2011-04-26 91 views
0

我要加载的资源与此:如果设置为任何目录,我可以从classpath加载资源吗?

InputStream iStream = Config.class.getResourceAsStream("autopublisherpath.cfg"); 

所以我设置CLASSPATH,使其工作。这是我的目录层次结构:

- autopublisher 
    .classes 
    .lib 
    .resources 

如果我添加%AUTOPUBLISHER_HOME%\资源\ CONFIG我的classpath中我不能得到的资源。否则,如果我将我的.cfg文件放在类中并添加%AUTOPUBLISHER_HOME%\ classes,资源已正确加载。类dir不包含autopublisherpath.cfg以外的任何内容。

最后,我想打电话:

的Java com.test.Something

地方在哪里加载资源。事情是我想让用户修改这个配置文件,所以我没有把它包含在我的jar包中。

我没有正确理解CLASSPATH吗?

谢谢

回答

3

有一点要注意在使用getResourceAsStream是您检索资源名称的格式。默认情况下,如果您未指定路径(例如“autopublisherpath.cfg”),则类加载器会预期指定的资源与您在其上执行getResourcesAsStream方法的类所在的包相同。这样做的原因行为可以在JVM文档中找到用于getResourceAsStream

  • 如果名字用“/”(“\ u002f”)开始,然后是资源的绝对名称是名称的部跟着'/'。
  • 否则,绝对名具有以下形式的:modified_package_name/name

在你的具体的例子,如果Config类是设在com.test.config包,然后在“autopublisherpath.cfg的资源名称“将被转换为”/com/test/config/autopublisherpath.cfg“(包中的句点被替换为”/“字符)。其结果是,与原有项目的层次结构保持一致,你就需要将文件放入位置:

autopublisher/resources/config/com/test/config 

其中autopublisher/resources/config加入作为应用程序的执行类路径的一部分。

如果您正在寻找将特定配置目录添加到您的类路径并希望该文件位于该目录的根目录中,那么您需要在文件的名称前加一个“/”字符,该字符指定该资源应该位于类路径的根包中。

InputStream iStream = Config.class.getResourceAsStream("/autopublisherpath.cfg"); 

使用此代码,你应该能够在resource/config目录添加到您的类路径和读取文件的预期。

在附注上,getResourceAsStream方法使用从其执行的类的类加载器(在此情况下为Config)加载资源。除非您的应用程序使用多个类加载器,否则您可以使用从任何类实例执行相同的功能。

相关问题