【问题标题】:Best practices to work with file paths in Java在 Java 中使用文件路径的最佳实践
【发布时间】:2011-12-07 08:54:48
【问题描述】:

我正在尝试加载属性文件来创建配置。即 foo.properties。

存储此配置文件的最佳位置是什么。在我将使用的包中初始化使用类?在 src 的根级别?

另外,在访问文件时,我使用的是文件系统中文件的位置:即:c:\configs\foo.properties。

对此有更好的做法吗?例如使用相对于项目的路径而不是文件系统位置?如果是,我如何引用项目树中属性文件的位置。如:

src/
   /com.foo.bar
   /com.foo.car
   /com.foo.zar
   foo.properties

假设我想将属性文件读入内存,我如何在不使用操作系统位置/或文件系统中的位置的情况下访问此 foo.properties。

【问题讨论】:

  • 对您的问题的回答在很大程度上取决于您所谈论的应用类型、启动方式以及您所谈论的配置类型。

标签: java configuration path configuration-files


【解决方案1】:

我一直看到的做法是将属性文件放在 src/main/resources 中,然后使用getResourceAsStream() 访问它。

这是一个很好的问题:Load a resource contained in a jar

【讨论】:

    【解决方案2】:

    如果你想保留一些接近你当前结构的东西,那么你可以添加一个resources 文件夹,如下所示:

    src/
       /com.foo.bar
       /com.foo.car
       /com.foo.zar
    resources
       /foo.properties
    

    但我强烈建议遵循 Maven 目录结构,它们确实为您提供了很大的灵活性:

    src/
        /main
            /java
                /com.foo.bar
                /com.foo.car
                /com.foo.zar
            /resources
                /foo.properties
    

    无论您使用哪种布局,我都建议您将资源放在与您的 Java 包之一匹配的文件夹结构中,这样您就可以轻松地将它们作为资源加载,避免绝对与相对文件路径的难题。像这样的:

    src/
        /resources/
           /com/foo/bar/foo.properties
    

    给定一个类 com.foo.bar.MyClass 你可以这样做:

    InputStream is = MyClass. getResourceAsStream("com/foo/bar/foo.properties");
    

    【讨论】:

    • 好答案。我想强调的是,当您运行应用程序时,配置文件在类路径上 比它们在源代码树中的位置更重要。 Maven 默认结构支持这一点,因为 src/main/resourcessrc/test/resources 中的文件与 java 类一起被复制到类路径(以及 JAR 工件,如果有的话)。
    • 如果你有更多的动态资源怎么办?一个示例:“/resources/image”目录,您可以在其中根据外部提供的图像名称存储和检索图像。每次包含的图像集发生更改时,在 .jar 中包含“/resources/image”目录不会强制您重新构建应用程序吗?
    【解决方案3】:

    我认为位置确实取决于您的项目。我通常喜欢有一个特定的文件夹来存储配置文件。

    至于访问文件的方式,使用绝对路径是一个非常糟糕的想法:假设您想将应用程序作为 Jar 分发,将其部署在 Web 服务器上,或者只是将其完全移动到另一个地方!

    看看:

    http://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResourceAsStream-java.lang.String-

    如果您的类路径中有属性文件(例如,作为源代码的一部分),那么您可以以与您所在位置无关的相同方式加载它(即使在 jar 中)。

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 2018-02-28
      • 2021-09-07
      • 2012-05-12
      • 1970-01-01
      • 2011-10-30
      • 2021-11-20
      • 2011-11-28
      • 2016-03-20
      相关资源
      最近更新 更多