如何在Java中检索外部.properties文件?

如何在Java中检索外部.properties文件?,java,file,jakarta-ee,inputstream,properties-file,Java,File,Jakarta Ee,Inputstream,Properties File,尝试从项目外部的目录加载属性文件时遇到以下问题 因此,我的项目具有以下结构: PROJECT-ROOT | | |-----> confi | |------> src | | |------> mainPkg (the package name) |

尝试从项目外部的目录加载属性文件时遇到以下问题

因此,我的项目具有以下结构:

PROJECT-ROOT
     |
     |
     |-----> confi
     |
     |------> src
               |
               |
               |------> mainPkg (the package name)
                           |
                           |
                           |------> Main (the main class containing the main() method)
好的,我需要将config.properties文件加载到主类中,该文件位于项目根文件夹之外(例如,在同一级别)。因此我认为,config.properties文件位于应用程序类路径的外部

所以我试着这样做:

InputStream input = new FileInputStream("../../config.properties");

但不工作,因为我获得以下异常:

java.io.FileNotFoundException: ..\..\config.properties (Impossibile trovare il file specificato)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:120)
    at java.io.FileInputStream.<init>(FileInputStream.java:79)
    at mainPkg.Main.main(Main.java:41)
并正确检索InputStrea对象。但这对我的目的不好,因为我不能使用绝对路径

如何使用相对路径检索与项目根文件夹位于同一级别的config.properties文件?

项目根将是程序的当前工作目录。所以,你应该试试看

InputStream input = new FileInputStream("../config.properties");
但是,这不是建议的设置。该文件应放在项目目录中,并且在发布应用程序时应进行适当的jar处理。

项目根目录将是程序的当前工作目录。所以,你应该试试看

InputStream input = new FileInputStream("../config.properties");

但是,这不是建议的设置。该文件应放在项目目录中,并且在发布应用程序时应适当地加罐。

如果config.properties文件超出类路径,则应使用文件夹作为起点(例如用户文件夹或当前工作文件夹)

相反,如果文件在类路径中,则可以尝试使用this.class.getResourceAsStream或this.class.getClassLoader().getResourceAsStream()

在一个简单的上下文中,两个调用之间的区别非常简单: 当且仅当文件位于调用该方法的类的同一包中时,此.class.getResourcesCeasStream(“config.properties”)将返回InputStream


相反,此.class.getClassLoader().getResourceAsStream(“config.properites”)仅当文件位于类路径的根上时才会返回相同的InputStream。在这种情况下,您必须将“config”文件夹添加到类路径

如果config.properties文件超出类路径,您应该使用文件夹作为起点(例如用户文件夹或当前工作文件夹)

相反,如果文件在类路径中,则可以尝试使用this.class.getResourceAsStream或this.class.getClassLoader().getResourceAsStream()

在一个简单的上下文中,两个调用之间的区别非常简单: 当且仅当文件位于调用该方法的类的同一包中时,此.class.getResourcesCeasStream(“config.properties”)将返回InputStream


相反,此.class.getClassLoader().getResourceAsStream(“config.properites”)仅当文件位于类路径的根上时才会返回相同的InputStream。在这种情况下,您必须将“config”文件夹添加到类路径

注意:在执行过程中,您的相对路径是相对于工作目录的,而不是包含源文件的目录。在开发过程中,在IDE中,您可以在启动器中设置工作目录。在生产环境中,您可以使用MyClass.class.getProtectionDomain().getCodeSource().getLocation()计算jar文件位置的绝对路径,然后应该从当前工作目录中读取,或者使用命令行参数指定。注意:在执行过程中,您的相对路径是相对于工作目录的,而不是包含源文件的目录。在开发过程中,在IDE中,您可以在启动器中设置工作目录。在生产环境中,您可以使用MyClass.class.getProtectionDomain().getCodeSource().getLocation()从jar文件位置计算绝对路径。如果属性文件不包含在jar中,则应该从当前工作目录中读取,或者使用命令行参数指定。
InputStream input = new FileInputStream("../config.properties");