Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getResourceAsStream not working for every class?

Tags:

java

jar

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,

like image 374
Dikla Avatar asked May 17 '09 05:05

Dikla


2 Answers

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.

like image 122
Jon Skeet Avatar answered Sep 21 '22 13:09

Jon Skeet


Here are some examples that back up Jon Skeet's explanation:

Premise: You have a class my.package.A that depends on foo.txt.

  1. 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.

  2. 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.

  3. 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.

like image 6
schmmd Avatar answered Sep 19 '22 13:09

schmmd