如何在Java中引用资源?

时间:2010-09-16 15:04:50

标签: java file-io embedded-resource

我需要在我的代码中读取一个文件。它实际上驻留在这里:

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt

我把它放在一个源包中,这样当我创建一个可运行的jar文件(Export-> Runnable JAR文件)时,它就会被包含在jar中。最初我在项目根目录中使用了它(并且还尝试了一个普通的子文件夹),但是导出不包括在jar中。

如果在我的代码中,我会这样做:

File myFile = new File("com\\company\\somePackage\\MyFile.txt");

jar文件正确定位文件,但是在本地运行(Run As-> Java Main应用程序)会抛出一个找不到文件的异常,因为它预期它是:

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt");

但这在我的jar文件中失败了。所以我的问题是,如何使这个概念在本地和我的jar文件中运行?

2 个答案:

答案 0 :(得分:33)

使用ClassLoader.getResourceAsStreamClass.getResourceAsStream。两者之间的主要区别在于ClassLoader版本始终使用“绝对”路径(在jar文件或其他内容中),而Class版本相对于类本身,除非您在路径前添加前缀用/.

因此,如果您有一个类com.company.somePackage.SomeClasscom.company.other.AnyClass(在与资源相同的类加载器中),您可以使用:

SomeClass.class.getResourceAsStream("MyFile.txt")

AnyClass.class.getClassLoader()
              .getResourceAsStream("com/company/somePackage/MyFile.txt");

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt");

答案 1 :(得分:0)

如果我将i文件放在一个jar文件中,只有当我使用

时它才有用
...getResourceAsStream("com/company/somePackage/MyFile.txt")

如果我使用的是File对象,它就无法工作了。我还得到了FileNotFound异常。现在,我留在InputStream对象。