【问题标题】:How to open a resource file in a WAR using a string pathname?如何使用字符串路径名在 WAR 中打开资源文件?
【发布时间】:2012-04-04 05:52:39
【问题描述】:

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

Reader reader = new BufferedReader(new FileReader(path));

上面的path是一个String,通过Spring的applicationContext.xml文件作为属性传递给这个类。

如果我想将所有这些配置文件放在 WAR 中,我应该指定什么字符串路径?这甚至可以做到吗?还是组件不正确,应该改用getResourceAsStream()

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

中的资源创建正确的文件路径

【问题讨论】:

    标签: java spring file-io war ear


    【解决方案1】:

    在spring环境下最好使用spring resources API 简单例子:

    @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 中),则应将此类路径放在主属性文件中并在应用程序部署时加载。

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

    【讨论】:

      【解决方案2】:

      访问文件的关键是使它们在您的类路径中可用。默认情况下,在 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"));
      

      希望这会有所帮助。

      祝你好运!

      【讨论】:

      • 在类路径中包含文件资源可以简化访问。但是还有另一种可能性,就像question 的答案中描述的那样。 servlet API 描述了此类资源的位置。基本上你的 WAR 应该包含一个文件夹 META-INF/resources,你的文件不应该在类路径中,必须放在其中。
      • 这个答案对我不起作用。我收到一个IOException,因为找不到该文件。另外,我看到以下评论,“默认情况下,java.io 包中的类总是根据当前用户目录解析相对路径名。该目录由系统属性 user.dir 命名,通常是 Java 所在的目录虚拟机被调用。”在java.io.File javadoc
      • 根据spring你需要使用“classpath:MyResource.properties”来指定资源。你可以在这里找到参考static.springsource.org/spring/docs/2.0.x/reference/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2021-11-11
      • 2015-07-24
      相关资源
      最近更新 更多