我在这里阅读了很多帖子并完成了许多谷歌搜索,但我仍然无法从当前项目中的另一个java包中读取文件。
在我的一个类中,我有以下代码,但输入流始终为null。我已经尝试过使用上下文类加载器,以及许多其他解决方案,但无济于事。
InputStream is = this.getClass().getResourceAsStream( "opcodes.txt" );
System.out.println(is);
另一种尝试是:
InputStream is = ClassName.class.getResourcceAsStream("/resources/opcodes.txt");
也返回null。
为什么我无法在资源包中找到该文件的任何帮助或解释都会很棒。
P.S。如果这会产生影响,我正在使用eclipse。
编辑:如果我使用OpenFileDialog查找文件,我可以打开并阅读它,因此该文件确实存在且没有损坏。
答案 0 :(得分:1)
getResourceAsStream()方法的文档,可在此处找到: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String) 说: “ 在委派之前,使用此算法从给定的资源名称构造绝对资源名称:
如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。 否则,绝对名称具有以下形式: modified_package_name /名称 其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。 “
如果资源位于与您调用方法所在的类相同的包中,那么您的第一次尝试就会成功。您的第二次尝试失败,因为,如文档所述,您提供的文件的名称(“/resources/opcodes.txt”)将替换为“resources / opcodes.txt”。我想这意味着该方法现在将在调用该方法的类所在的包中搜索包资源,而不是在它之外。由于您没有这样的内部包,因此该方法返回null。
解决方法是在资源所在的包中定义一个类。对于所有你关心的人来说,这堂课可能是空的请致电:
ClassWithinResourcePackage.class.getResourceAsStream("opcodes.txt");
从您当前调用该方法的类中,它可以正常工作。
我也尝试使用我从命令行知道的“..”语法,但它不起作用。我认为文档暗示该方法只在同一个包中寻找文件。
答案 1 :(得分:1)
资源文件通常放在项目的src/main/resources/
目录中。这些资源也包含在jar
旁边,带有扩展名为.class的已编译类文件。
我创建了一个带有上面讨论的目录层次结构的示例maven项目。
可以在程序中访问资源文件sample-resource.properties
,如下所示:
package temp;
import java.io.InputStream;
import java.util.Scanner;
public class ResourceTest {
public static void main(String[] args) {
InputStream inputStream = ResourceTest.class.getResourceAsStream("/sample-resource.properties");
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
}
}