从类路径资源(XML文件)获取输入流


80

在Java Web应用程序中,假设我想获取放置在CLASSPATH中(即,在sources文件夹中)的XML文件的InputStream,该怎么办?

Answers:


95

ClassLoader.getResourceAsStream()

如下面的评论所述,如果您处于多ClassLoader环境(例如单元测试,Web应用程序等)中,则可能需要使用Thread.currentThread().getContextClassLoader()。参见http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#comment21307593_2308388



13
如果您在多类加载器环境中(例如单元测试/ webapps等),则可能需要使用此Thread.currentThread()。getContextClassLoader()。见stackoverflow.com/questions/2308188/…–
khylo

请在回答中添加@khylo的建议!
froginvasion 2015年

7
另一种方式:InputStream is = new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

1
@zhuguowei ClassPathResource是一个Spring类。
ichalos '18

31
ClassLoader.class.getResourceAsStream("/path/file.ext");

但是,如果以这种方式在tomcat中部署Web应用会出现错误:java.lang.NullPointerException: null ,而我认为最简单的方式是new ClassPathResource("/path/to/your/file").getInputStream()
zhuguowei

你能告诉Ø如何让它在战争中使用
维克拉姆·赛尼

我部署时遇到了同样的问题。有人能找到解决这种情况的方法吗?
Augusto

12

这取决于XML文件的确切位置。它在源文件夹中(在“默认包”或“根目录”中)还是在与该类相同的文件夹中?

在前一种情况下,您必须使用“ /file.xml”(注意前导斜杠)来查找文件,并且使用哪个类来尝试查找文件都没有关系。

如果XML文件位于某个类的旁边,那么SomeClass.class.getResourceAsStream()只需使用文件名即可。


11

ClassLoader.class.getResourceAsStream("/path/to/your/xml") 并确保您的编译脚本将xml文件复制到CLASSPATH中的位置。


6

someClassWithinYourSourceDir.getClass()。getResourceAsStream();


或其他getClass().getResourceAsStream("...")方式
rogerdpack

4

此答案中的某些“ getResourceAsStream()”选项对我不起作用,但此选项可以:

SomeClassWithinYourSourceDir.class.getClassLoader()。getResourceAsStream(“ yourResource”);


0

我尝试了建议的解决方案,文件名中的正斜杠对我不起作用,例如:...()。getResourceAsStream(“ / my.properties”); 返回null

删除斜线有效:.... getResourceAsStream(“ my.properties”);

这是来自doc API的:委派之前,使用以下算法从给定的资源名称构造绝对资源名称:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:

    modified_package_name/name 

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e'). 

就我而言,我null 没有/。添加斜杠字符对我有用。@ hussein-terek和我的设置以及您的设置之间肯定还有其他区别。
Ajoy Bhatia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.