getResourceAsStream对每个类都不起作用?

6

我有一个使用一些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;
        }
    }
}

这段代码完美运行。

问题是,如果我将类A定义为extends java.io.File,那么我从getResourceAsStream获取的InputStream将为空。

此外,如果我将类A保留为常规类(未继承),并定义类B如下:

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

返回的InputStream仍然为空。

问题是什么?有没有一种方法可以从继承了File的类中访问文件?

谢谢。

4个回答

11

我怀疑这与包有关,而不是继承。

如果你的类在一个包中,那么getResourceAsStream()将相对于该包,除非你以“/”开头(这使它成为“绝对”资源)。另一种选择是使用getClass().getClassLoader().getResourceAsStream(),它没有任何关于路径相对于包的概念。

只是简单地继承File不应该影响行为。如果您真的认为它会产生影响,请发布一个简短但完整的程序来演示问题。


你是对的。问题不同了。请看我的回答。谢谢! - Dikla

6
以下是一些支持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。

1

在我看來,使用getClass().getClassLoader().getResourceAsStream()仍然更好,因為上面的代碼可能會失敗,如果你子類化了某個類(而且子類在另一個包中)並調用其父類的方法。


0

抱歉,问题不同。(实际上没有问题...)

在继承自java.io.File的类中,我使用getPath()以获取资源的路径。但路径用反斜杠而不是正斜杠(因为我在Windows操作系统上工作)。当我使用正斜杠时,即使使用继承的类,它也能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接