【问题标题】:How to read a properties file in java from outside the Class folder?如何从 Class 文件夹外部读取 java 中的属性文件?
【发布时间】:2012-06-28 19:07:59
【问题描述】:

主类的路径结构如下:

D:/java/myapp/src/manClass.java

我想把属性文件放进去

D:/java/myapp/config.properties

其中将包含一个文件名和一些其他配置。我将在属性文件中设置文件名,如下所示:file=file_to_read.txt

file_to_read.txt 将位于D:/java/myapp/folder_of_file/

主类会先从属性文件中读取文件名,然后再从文件中获取内容。

如果config.propertiesfile_to_read.txt 都在src/mainClass.java 中,我可以这样做。但无法以我想要的方式成功。

谁能帮我解决这个问题?如果我想将myapp 文件夹放在我的驱动器中的任何位置,并且内部结构与我上面描述的相同,我需要你的建议我该怎么做,并且程序将正确地完成工作。

我还需要您的建议,如果我想从构建项目后创建的 jar 中完成这项工作,那么我可以毫无问题地做到这一点吗?

我已经尝试如下只是为了读取属性文件:

        URL location = myClass.class.getProtectionDomain().getCodeSource().getLocation();

        String filePath = location.getPath().substring(1,location.getPath().length());

        InputStream in = myClass.class.getResourceAsStream(filePath + "config.properties");
        prop.load(in);

        in.close();

        System.out.println(prop.getProperty("file"));

但是当试图从属性文件中获取属性时,这会出错。 谢谢!

【问题讨论】:

    标签: java file file-io properties


    【解决方案1】:

    如何从Class文件夹外读取java中的属性文件?

    使用带有固定磁盘文件系统路径的FileInputStream

    InputStream input = new FileInputStream("D:/java/myapp/config.properties");
    

    更好的方法是将其移动到类路径覆盖的现有路径之一,或者将其原始路径D:/java/myapp/ 添加到类路径中。然后就可以得到如下:

    InputStream input = getClass().getResourceAsStream("/config.properties");
    

    InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
    

    【讨论】:

    • 是的,使用 BalusC 的第一个解决方案。
    • 谢谢,它对我有用。但是,我需要添加评论。如果将文件夹添加到类路径中,则在将资源作为流获取时不需要指定文件夹,这意味着您只需调用 getResourceAsStream("/config.properties") 即使该文件位于名为资源
    • @Jesus:是的,它的目的是像使用(默认)类路径中的所有其他文件夹一样使用文件夹的内容。
    【解决方案2】:

    感谢大家的建议。我已经通过这种方式完成了这项工作:

            Properties prop = new Properties();
            String dir = System.getProperty("user.dir");
            InputStream in = new FileInputStream(dir + "/myapp/config.properties");
            prop.load(in);
            in.close();
            String filePath = dir + "/myapp/folder_of_file/" + prop.getProperty("file"); /*file contains the file name to read*/
    

    【讨论】:

    • 这不是真正可移植的,或者您应该在应用程序的安装指南中非常清楚地记录这一点。只需放入类路径或将其路径添加到类路径就容易多了。
    • @BalusC,如果我想在运行时编辑属性文件怎么办?
    【解决方案3】:
    Properties property=new Properties();
    property.load(new FileInputStream("C:/java/myapp/config.properties"));
    

    【讨论】:

      【解决方案4】:

      您需要指定绝对路径,但您不应该对其进行硬编码,因为这会使在开发和生产环境等之间切换变得更加困难。

      您可以从系统属性中获取文件的基本路径,您可以在代码中使用 System.getProperty("basePath") 访问该属性,并且应该将其添加到文件名之前以创建绝对路径。

      在运行您的应用程序时,您可以在 java 命令行中指定路径,如下所示:

      java -DbasePath="/a/b/c" ...
      

      ... 表示运行程序的 Java 命令的当前参数。

      【讨论】:

        猜你喜欢
        • 2018-12-18
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2010-10-25
        相关资源
        最近更新 更多