tags:

views:

680

answers:

3

Hi,

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,

+2  A: 

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.

Jon Skeet
You are right. The problem was different. See my answer. Thanks!
Dikla
A: 

Sorry, the problem is different. (No problem actually...)

In the class that inherited from java.io.File I used getPath() in order to get the path to the resource. But the path had backslashes instead of regular slashes (since I work on Windows OS). When I used regular slashes, it worked even when using the inherited class.

Dikla
+1  A: 

IMHO it's still better to use getClass().getClassLoader().getResourceAsStream() since the above code may fail if you subclass (and the subclass is in another pacakge) and call a parents method.