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

fly*_*eaf 21 java file-io properties file

我对主类有以下路径结构:

D:/java/myapp/src/manClass.java
Run Code Online (Sandbox Code Playgroud)

我想把属性文件放入

D:/java/myapp/config.properties
Run Code Online (Sandbox Code Playgroud)

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

file_to_read.txt将位于D:/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"));
Run Code Online (Sandbox Code Playgroud)

但是当尝试从属性文件中获取getProperty时,这会给出错误.谢谢!

Bal*_*usC 33

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

使用FileInputStream具有固定磁盘文件系统路径.

InputStream input = new FileInputStream("D:/java/myapp/config.properties");
Run Code Online (Sandbox Code Playgroud)

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

InputStream input = getClass().getResourceAsStream("/config.properties");
Run Code Online (Sandbox Code Playgroud)

要么

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
Run Code Online (Sandbox Code Playgroud)

  • 是的,使用BalusC的第一个解决方案。 (2认同)

fly*_*eaf 9

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

        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*/
Run Code Online (Sandbox Code Playgroud)


cod*_*ker 5

Properties property=new Properties();
property.load(new FileInputStream("C:/java/myapp/config.properties"));
Run Code Online (Sandbox Code Playgroud)