我有一个使用一些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
?
谢谢,
答案 0 :(得分:10)
我怀疑这与包相关而不是继承。
如果您的班级在一个软件包中,那么getResourceAsStream()
将与该软件包相关,除非您使用“/”(这使其成为“绝对”资源)启动它。另一种方法是使用getClass().getClassLoader().getResourceAsStream()
,它不知道路径相对于包。
只是对File
进行子类化不应该影响行为。如果你真的相信它,请发一个简短但完整的程序来证明这个问题。
答案 1 :(得分:4)
以下是一些支持Jon Skeet解释的例子:
前提:你有一个my.package.A类依赖于foo.txt。
如果您使用my.package.A.class.getResourceAsStream(“foo.txt”)并将foo.txt放在jar文件中的my / package / foo.txt中,那么当您运行A类时它应该找到foo.txt。
如果你使用my.package.A.class.getClassLoader()。getResourceAsStream(“foo.txt”)然后将foo.txt放在类路径的任何文件夹中,当你运行A类它应该找到foo .TXT。
如果您使用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操作系统上工作)。当我使用常规斜杠时,即使使用继承的类也能正常工作。