getResourceAsStream不适用于每个类?

时间:2009-05-17 05:27:35

标签: 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;
        }
    }
}

此代码运行正常。

问题是,如果我将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 个答案:

答案 0 :(得分:10)

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

如果您的班级在一个软件包中,那么getResourceAsStream()将与该软件包相关,除非您使用“/”(这使其成为“绝对”资源)启动它。另一种方法是使用getClass().getClassLoader().getResourceAsStream(),它不知道路径相对于包。

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

答案 1 :(得分:4)

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

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

  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放在/foo.txt我的jar文件中,那么当您运行项目A时它应该找到foo.txt。

答案 2 :(得分:1)

恕我直言,使用getClass().getClassLoader().getResourceAsStream()仍然会更好,因为如果您继承(并且子类在另一个pacakge中)并调用parent方法,上面的代码可能会失败。

答案 3 :(得分:0)

对不起,问题不同了。 (实际上没问题......)

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