【问题标题】:Java Spring - How to use classpath to specify a file location?Java Spring - 如何使用类路径来指定文件位置?
【发布时间】:2012-11-26 19:44:53
【问题描述】:

如何使用类路径来指定 Spring 项目中文件的位置?

这是我目前拥有的:

FileReader fr = new FileReader("C:\\Users\\Corey\\Desktop\\storedProcedures.sql");

这是硬编码到我的桌面的。我想要的是能够使用我项目中文件的路径。

FileReader fr = new FileReader("/src/main/resources/storedProcedures.sql");

有什么建议吗?

【问题讨论】:

    标签: java spring classpath


    【解决方案1】:

    我们是在谈论标准java.io.FileReader 吗?行不通,但没有它也不难。

    /src/main/resources maven 目录内容被放置在您的 CLASSPATH 的根目录中,因此您可以使用以下方法简单地检索它:

    InputStream is = getClass().getResourceAsStream("/storedProcedures.sql");
    

    如果结果不是null(找不到资源),请随意将其包装在阅读器中:

    Reader reader = new InputStreamReader(is);
    

    【讨论】:

    • 这在 Spring 中确实对我有用,但是我如何使用 WRITING 来做到这一点?我尝试了各种BufferedWriter 实现,但没有一个有效T_T
    • 正是我的问题!我以某种方式阅读了该文件,但有人会告诉我在写的情况下应该使用什么?
    【解决方案2】:

    来自@NimChimpsky 在similar question 中的回答:

    Resource resource = new ClassPathResource("storedProcedures.sql");
    InputStream resourceInputStream = resource.getInputStream();
    

    使用ClassPathResource 和接口Resource。并确保您正确添加资源目录(将/src/main/resources/ 添加到类路径中)。

    请注意,Resource 有一个获取java.io.File 的方法,因此您也可以使用:

    Resource resource = new ClassPathResource("storedProcedures.sql");
    FileReader fr = new FileReader(resource.getFile());
    

    【讨论】:

      【解决方案3】:

      Spring 有 org.springframework.core.io.Resource 专为这种情况而设计。从 context.xml 你可以将类路径传递给 bean

      <bean class="test.Test1">
              <property name="path" value="classpath:/test/test1.xml" />
          </bean>
      

      你在你的bean中得到它作为资源:

      public void setPath(Resource path) throws IOException {
          File file = path.getFile();
          System.out.println(file);
          }
      

      输出

      D:\workspace1\spring\target\test-classes\test\test1.xml
      

      现在你可以在 new FileReader(file) 中使用它

      【讨论】:

      • 您可以将 setter 中的 Resource 替换为 File 以节省您必须调用 path.getFile();
      【解决方案4】:

      看起来你有 maven 项目,所以资源在类路径中

      去

      getClass().getResource("classpath:storedProcedures.sql")
      

      【讨论】:

      • classpath: 前缀在核心 Java 中不起作用,它是 Spring 特定的。
      • 当然,问题是关于spring
      猜你喜欢
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2012-01-08
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多