getResourceAsStream不适用于每个类?

Dik*_*kla 4 java jar

我有一个使用一些txt文件的jar文件.为了得到它们它使用Class.getResourceAsStream功能.

Class A
{
    public InputStream getInputStream(String path) throws Exception {
        try {
            return new FileInputStream(path);
        } catch (FileNotFoundException ex) {
            InputStream inputStream = getClass().getResourceAsStream(path);
            if (inputStream == null)
                throw new Exception("Failed to get input stream for file " + path);
            return inputStream;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码完美无缺.

问题是,如果我将类A定义为extends java.io.File,则我得到的InputStream getResourceAsStream为null.

另外,如果我将A类作为常规类(不是继承),并将B类定义为:

Class B extends java.io.File
{
    public InputStream getInputStream(String path) throws Exception
    {
     return new A().getInputStream(path);
 }
}
Run Code Online (Sandbox Code Playgroud)

返回的InputStream仍然为null.

问题是什么?有没有办法从继承的类访问该文件File

谢谢,

Jon*_*eet 10

我怀疑这更多地与包相关而不是继承.

如果你的类在一个包中,那么getResourceAsStream()将相对于该包,除非你用"/"启动它(这使它成为一个"绝对"资源).另一种方法是使用getClass().getClassLoader().getResourceAsStream()不了解路径相对于包的任何想法.

只是子类化File不应该影响行为.如果你真的相信它,请发一个简短但完整的程序来证明这个问题.


sch*_*mmd 5

以下是一些支持Jon Skeet解释的示例:

前提:您有一个依赖于foo.txt的类my.package.A。

  1. 如果您使用my.package.A.class.getResourceAsStream(“ foo.txt”)并将foo.txt放在jar文件中的my / package / foo.txt上,那么当您运行A类时,它应该找到foo.txt 。

  2. 如果使用my.package.A.class.getClassLoader()。getResourceAsStream(“ foo.txt”),则将foo.txt放在类路径上的任何文件夹中,当您运行类A时,它应该找到foo.txt。

  3. 如果您使用my.package.A.class.getResourceAsStream(“ / foo.txt”)并将foo.txt放在我的jar文件中的/foo.txt上,那么当您运行项目A时,它应该找到foo.txt。