I have a jar file that uses some txt files. In order to get them it uses Class.getResourceAsStream
function.
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;
}
}
}
This code is working perfectly.
Problem is, if I define class A as extends java.io.File
, the InputStream I get from getResourceAsStream
is null.
Also, if I leave class A as regular class (not inherited), and define class B as:
Class B extends java.io.File
{
public InputStream getInputStream(String path) throws Exception
{
return new A().getInputStream(path);
}
}
the returned InputStream is still null.
What is the problem? Is there a way to access the file from the class that inherits File
?
Thanks,
I suspect this is more to do with packages than inheritance.
If your class is in a package, then getResourceAsStream()
will be relative to that package unless you start it with "/" (which makes it an "absolute" resource). An alternative is to use getClass().getClassLoader().getResourceAsStream()
which doesn't have any idea of a path being relative to a package.
Just subclassing File
shouldn't affect the behaviour at all. If you really believe it does, please post a short but complete program to demonstrate the problem.
Here are some examples that back up Jon Skeet's explanation:
Premise: You have a class my.package.A that depends on foo.txt.
If you use my.package.A.class.getResourceAsStream("foo.txt") and you place foo.txt at my/package/foo.txt in your jar file, then when you run class A it should find foo.txt.
if you use my.package.A.class.getClassLoader().getResourceAsStream("foo.txt") then place foo.txt in any folder on the classpath, when you run class A it should find foo.txt.
if you use my.package.A.class.getResourceAsStream("/foo.txt") and you place foo.txt at /foo.txt in my jar file, then when you run project A it should find foo.txt.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With