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

2022-09-01 20:05:32

我有以下指向主类的路径结构:

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

我想把属性文件放在

D:/java/myapp/config.properties

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

这将位于file_to_read.txtD:/java/myapp/folder_of_file/

主类将首先从属性文件中读取文件名,然后从该文件中获取内容。

我可以这样做,如果两者都在.但无法以我想要的方式成功。config.propertiesfile_to_read.txtsrc/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"));

但是,当尝试从属性文件中获取属性时,这会产生错误。谢谢!


答案 1

如何从类文件夹外部读取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");

答案 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*/