26

我正在尝试加载属性文件。这是我的结构

目录结构

现在我正在尝试加载 test.properties 文件。但我越来越空了。我在这里怎么样

public class Test {

    String workingDir = System.getProperty("user.dir");
    System.out.println("Current working directory : " + workingDir);

    File temp = new File(workingDir + "\\" + "test.properties");
    String absolutePath = temp.getAbsolutePath();
    System.out.println("File path : " + absolutePath);

    Properties properties = null;

    try {
        properties = new Properties();
        InputStream resourceAsStream =  Test.class.getClassLoader().getResourceAsStream(absolutePath);
        if (resourceAsStream != null) {
            properties.load(resourceAsStream);
        }


    } catch (IOException e) {
        e.printStackTrace();
    }

    System.exit(0);

} //end of class Test

该程序打印

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties

但它没有从该路径加载属性文件。虽然它在那里。为什么我得到 null ?

谢谢

编辑 - - - - - - - - - - - - - - - -

String workingDir = System.getProperty("user.dir");
System.out.println("Current working directory : " + workingDir);

File temp = new File(workingDir, "test.properties");

String absolutePath = temp.getAbsolutePath();
System.out.println("File path : " + absolutePath);

try {
    properties = new Properties();
    InputStream resourceAsStream =  new FileInputStream(temp);
    if (resourceAsStream != null) {
        properties.load(resourceAsStream);
    }   
} catch (IOException e) {
    e.printStackTrace();
}

System.exit(0);

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties
java.io.FileNotFoundException: D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at com.softech.ls360.integration.BatchImport.main(BatchImport.java:57)
4

6 回答 6

28

哦哦……这里有几个问题:

1)在您提供的第一个代码片段中,您使用的是ClassLoader用于加载资源文件。这确实是一个不错的决定。但是该getResourceAsStream方法需要一个“类路径相对”名称。您提供的是绝对路径。

2) 您的第二个代码片段(编辑后)导致无法找到文件“D:...\LS360BatchImportIntegration\test.properties”。根据您的屏幕截图,该文件应为“D:...\LS360AutomatedRegulatorsReportingService\test.properties”。这是另一个目录。

我担心,您的描述与您机器上的发现不是最新的。

但是,让我们转向一个合理的解决方案:

1) 在您的 Eclipse 项目中(屏幕截图告诉我们,您正在使用 Eclipse),在与您的“src”目录相同的深度创建一个名为“resources”的新目录。将属性文件复制(或更好地移动)到其中。

2)这个新目录必须放入“构建路径”。右键单击 Package Explorer 或 Project Explorer 视图中的目录,选择“Build Path”,然后选择“Use as Source Folder”。注意:此构建路径将是项目的类路径,当您运行它时。

3) 由于资源目录现在是你的类路径的一部分并且包含你的属性文件,你可以简单地用getResourceAsStream("test.properties").

编辑

我刚刚看到,您还使用 Maven(pom.xml 文件)。在 Maven 中,这样的资源目录默认存在并且是构建路径的一部分。它是“src/main/resources”。如果是这样,只需使用它。

于 2013-08-05T09:43:26.807 回答
15

请将您的属性文件放在 /src/main/resources 文件夹中并从 ClassLoader 加载。这将是修复。

喜欢

 /src/main/resources/test.properties



Properties properties = null;

try {
    properties = new Properties();
    InputStream resourceAsStream =  Test.class.getClassLoader().getResourceAsStream("test.properties");
    if (resourceAsStream != null) {
        properties.load(resourceAsStream);
    }


} catch (IOException e) {
    e.printStackTrace();
}
于 2013-08-05T10:18:15.170 回答
10

您正在使用类加载器(在类路径中读取),而您正在使用绝对路径。

只需尝试:

InputStream resourceAsStream =  new FileInputStream(temp);

作为旁注,请尝试实例化您的文件:

File temp = new File(workingDir, "test.properties");

使用系统相关的路径分隔符。

于 2013-08-05T07:56:08.653 回答
1

我希望这有帮助 !!您可以将 test.properties 保存到 src/main/resources

 public static Properties props = new Properties();
    InputStream inStream = Test.class.getResourceAsStream("/test.properties");
    try {
            loadConfigurations(inStream);
        } catch (IOException ex) {
            String errMsg = "Exception in loading configuration file. Please check if application.properties file is present in classpath.";
            ExceptionUtils.throwRuntimeException(errMsg, ex, LOGGER);
        }
    public static void loadConfigurations(InputStream inputStream) throws IOException{
            props.load(inputStream);
        }
于 2020-04-29T20:49:17.123 回答
1

我有一个类似的问题,文件未被getResourceAsStream(). 该文件位于资源文件夹 ( src/main/resources) 中,但仍未找到。

当我进入 Eclipse 包资源管理器并“刷新”资源文件夹时,问题得到了解决。它在目录中,但 Eclipse 直到刷新文件夹后才看到它(右键单击文件夹并选择 Refresh)。

于 2016-03-10T11:15:22.353 回答
0

您将文件路径传递给getResourceAsStream(String name),但name这里是类路径,而不是文件路径...

您可以确保该文件位于您的类路径中,或者使用 aFileInputStream代替。

于 2013-08-05T07:53:00.827 回答