ClassLoader getResourceAsStream返回null

IAm*_*aja 29 java eclipse inputstream classpath classloader

我的项目目录结构(在Eclipse中):

MyProject/
    src/        --> "source directory" on Eclipse's classpath/buildpath
        com.me.myapp
            Driver
            myconfig.txt
Run Code Online (Sandbox Code Playgroud)

Driver,我有以下代码:

public class Driver {
    public static void main(String[] args) {
        InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream("myconfig.txt");
        if(is == null)
            System.out.println("input stream is null");
        else
            System.out.println("input stream is NOT null :-)");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到以下控制台输出:

input stream is null
Run Code Online (Sandbox Code Playgroud)

为什么?我是否放置myconfig.txt在错误的位置?我是否错误地使用了ClassLoader API?别的什么?提前致谢!

Sot*_*lis 43

如果它在同一个包中使用

InputStream is = Driver.class.getResourceAsStream("myconfig.txt");
Run Code Online (Sandbox Code Playgroud)

你拥有它的方式

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("myconfig.txt");
Run Code Online (Sandbox Code Playgroud)

它正在类路径的根目录中查找文件.你可以用

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("com/me/myapp/myconfig.txt");
Run Code Online (Sandbox Code Playgroud)

搜索规则在javadocClassLoader#getResource(String)javadoc中解释Class#getResource(String).


小智 10

如果您正在使用Maven,请在BUILD标记下添加以下行.在服务器上运行webapp时出现此错误,但没有引用服务器上的资源.

因此,将以下内容添加到您的POM.xml中并查看魔术.

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>fileName.txt</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>fileName.wsdl</include>
        </includes>
    </resource>
</resources>
Run Code Online (Sandbox Code Playgroud)

玩得开心.!!!