【问题标题】:Accessing filesystem from java within Spring and tomcat在 Spring 和 tomcat 中从 java 访问文件系统
【发布时间】:2012-01-05 17:14:34
【问题描述】:

我正在尝试使用 spring/tomcat 进行一些 xml 编组...我的应用程序像战争文件一样正常部署。该文件确实被复制到了正确的位置WEB-INF/classes/myData.xml,但我不确定如何从 Java 尤其是我的 spring 服务层访问它。像往常一样,我从应用上下文本身访问文件。

我想这样做:

final File xml = new File("WEB-INF/classes/myData.xml");

但在我的开发版本中,它转到 F:\eclipse\WEB-INF\classes\myData.xml 而不是 tomcat 中的部署目录

【问题讨论】:

    标签: java spring tomcat


    【解决方案1】:

    在 Spring 中,使用 Java 执行此操作的一种简洁方法是使用 ClasspathResource

    Resource myData = new ClasspathResource("myData.xml"):
    

    或者,如果这是一个 Spring bean 做的工作,那么你可以从 XML 注入它,例如

    <property name="myResource" value="classpath:myData.xml"/>
    

    ... 假设 myResourceResource 类型的 Spring bean 上的 javabean 属性。

    WEB-INF/classes 目录自动位于服务器的类路径中,您不需要(不应该)在路径中明确指定。

    Spring Resource 接口提供了多种获取数据本身的方法(例如getInputStream()

    【讨论】:

      【解决方案2】:

      如果你确定要获取到你的资源的路径,你可以检索它的 URL 然后解析它,像这样:

          URL url = getClass().getResource("/WEB-INF/web.xml");
          String path = url.toString();
          if (path.startsWith("file:/")) {
              path = path.substring("file:/".length());
              File file = new File(path); 
              ...do something with the file...
          }
      

      但是,有一点需要注意:您的资源可能直接从 JAR 存档中读取,而不是从文件系统中的平面文件中读取,因此无法通过 File 对象真正访问。上面的片段在 JBoss(包括 Tomcat)中工作,但是 JBoss 在部署它之前会分解一个 WAR 存档 - 不确定纯 Tomcat 是否也会这样做。

      主要问题是:为什么您真的想以 File 对象的形式获取资源?也许获取它的 URL 就足够了?或者您可能只需要读取权限?

      如果您只需要读取权限,获取类路径上的任何资源(如上面的 web.xml)的最简单方法就是调用:

      InputStream in = getClass().getResourceAsStream("/WEB-INF/web.xml")
      

      如果你想对文件进行写访问,一个更好的解决方案是预先配置一个目录(例如,通过 web.xml),在那里解压缩所有需要的文件(例如,通过上面的 getResourceAsStream 方法),然后从独立于应用程序服务器的预定义目录编辑和访问它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-28
        • 2014-02-21
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-09
        • 2023-03-05
        相关资源
        最近更新 更多