题 getResourceAsStream()返回null。属性文件未加载


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

Directory Structure

现在我正在尝试加载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

但它没有从此路径加载属性文件。虽然它存在于那里。为什么我会变空?

谢谢

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

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)

16
2017-08-05 07:48


起源




答案:


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

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

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

我担心,您的描述与您机器上的调查结果不符。

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

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

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

3)由于资源目录现在是类路径的一部分并包含属性文件,因此您只需加载它即可 getResourceAsStream("test.properties")

编辑

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


24
2017-08-05 09:43



是的我发现我复制了 test.proeprties档案错误的地方。现在它是在将它放在正确的位置后从流加载:)。是的我正在使用maven。你的意思是将属性文件移动到 src/main/resources 夹。并添加 src/main/resources 右键单击文件夹到类路径,如你所说(第2点)? - Basit
我认为 src/main/resources 已经在maven的课程路径..? - Basit
@Basit:没错。 “src / main / resources”是此类资源的Maven默认目录。如果您使用Maven打包您的应用程序,它将被自动考虑(并成为您的JAR的一部分)。如果您在Eclipse中运行该项目,则M2E插件会处理该问题。 - Seelenvirtuose
是的,它放入后加载 src/main/resources。我想做的一件事,当jar被制作然后属性文件包含在jar中,我不想将它包含在jar中,我已经使用maven完成了它,但是我从jar中移动后卡住我怎么能指示我的jar读取属性文件。如果我打开我的jar,那么我的属性文件是jar的根目录。 - Basit
我可以清楚地想象你的步骤。 :) - Nirmit Dalal


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

只需尝试:

InputStream resourceAsStream =  new FileInputStream(temp);

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

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

使用系统相关的路径指示器。


8
2017-08-05 07:56



我正在例外。文件未找到异常原因?我用这个 InputStream resourceAsStream = new FileInputStream(temp);。那里有属性文件。你可以在输出中看到它......? - Basit
请检查我的编辑.. - Basit
实际上,你的 workingDir 不是包含属性的那个!你的房产在 LS360AutomatedRegulatorsReportingService 而代码返回 LS360BatchImportIntegration - Jean Logeart
是的,我想通了,现在它正在加载:)。其实我正在制作jar,我想在制作jar后,属性文件,不包含在jar中,否则即使是测试我需要再次创建jar。所以我希望我把我的属性文件放在一个地方,在制作jar之后,我可以指着我的罐子从那里读取属性文件。我正在使用maven创建jar。 - Basit


请将您的属性文件放在/ 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();
}

5
2017-08-05 10:18



好吧,放入资源文件夹后,然后使用 InputStream resourceAsStream = BatchImport.class.getResourceAsStream("test.properties");。是吗 ? - Basit
是的,Becasue ClassLoader在类路径中搜索文件 - Mukhtiar Ahmed


您正在传递文件路径 getResourceAsStream(String name)但是 name 这是一个类路径,而不是文件路径......

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


0
2017-08-05 07:53





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

当我进入eclipse Package Explorer并“刷新”资源文件夹时,问题得到了解决。它位于目录中,但是在刷新文件夹之前Eclipse没有看到它(右键单击该文件夹并选择Refresh)。


0
2018-03-10 11:15