我有一个使用一些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不应该影响行为.如果你真的相信它,请发一个简短但完整的程序来证明这个问题.
以下是一些支持Jon Skeet解释的示例:
前提:您有一个依赖于foo.txt的类my.package.A。
如果您使用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放在我的jar文件中的/foo.txt上,那么当您运行项目A时,它应该找到foo.txt。
| 归档时间: |
|
| 查看次数: |
6453 次 |
| 最近记录: |