Java 如何在WAR中使用字符串路径名打开资源文件?

Java 如何在WAR中使用字符串路径名打开资源文件?,java,spring,file-io,war,ear,Java,Spring,File Io,War,Ear,我正在构建WAR/EAR,我的一个组件使用文件IO读取许多自定义配置文件: Reader reader = new BufferedReader(new FileReader(path)); 上面的路径是一个字符串,通过Spring的applicationContext.xml文件作为属性传递给这个类 如果要将所有这些配置文件放入WAR中,我应该指定什么字符串路径?这能做到吗?或者组件不正确,应该使用getResourceAsStream() 我四处浏览,发现了很多关于getResource(

我正在构建WAR/EAR,我的一个组件使用文件IO读取许多自定义配置文件:

Reader reader = new BufferedReader(new FileReader(path));
上面的路径是一个字符串,通过Spring的applicationContext.xml文件作为属性传递给这个类

如果要将所有这些配置文件放入WAR中,我应该指定什么字符串路径?这能做到吗?或者组件不正确,应该使用
getResourceAsStream()


我四处浏览,发现了很多关于
getResource()
和URI的信息。但是,我找不到是否可以在applicationContext.xml

中为资源创建正确的文件路径访问文件的关键是使它们在类路径中可用。默认情况下,在WAR文件中,WEB-INF/classes下的所有文件都添加到类路径中,您可以引用这些文件

例如:假设这是您的WAR文件结构

webapp.war
 |
 |---> WEB-INF
 |------|
 |      |----> classes
 |              |----> MyResource.properties
 |---> index.html
 |---> images
 |-------|
 |       ----> logo.gif
您可以使用以下API访问“MyResource.properties”

Reader reader = new BufferedReader(new FileReader("MyResource.properties"));
希望这有帮助


祝你好运

在春季环境中,最好使用 简单的例子:

@Inject
private ResourceLoader resourceLoader;

public void someMethod() {
    Resource resource = resourceLoader.getResource("file:my-file.xml");
    InputStream is = null;
    try {
        is = resource.getInputStream();
        // do work
        ....
    } finally {
        IOUtils.closeQuetly(is);
    }
}
如果您想访问具有非固定路径的外部文件(非类路径资源,应该位于存档中的META-INF/resources中),您应该将这些路径放在主属性文件中,并将其加载到app deploy中


编辑:在示例中将@Resource更改为@Inject

在类路径中拥有文件资源可以简化访问。但还有另一种可能性,就像在回答这个问题时所描述的那样。描述了这些资源应该位于何处。基本上你的WAR应该包含一个META-INF/resources文件夹,在那里你的文件,不应该在类路径中,必须被放置。我得到一个
IOException
,因为找不到该文件。此外,我还看到了下面的评论:“默认情况下,java.io包中的类总是根据当前用户目录解析相对路径名。此目录由系统属性user.dir命名,通常是调用java虚拟机的目录。”根据spring,您需要使用“classpath:MyResource.properties”指定资源。你可以在这里找到参考资料