2009-05-17 7 views
4

Ich habe eine JAR-Datei, die einige TXT-Dateien verwendet. Um sie zu bekommen, verwendet es Funktion.getResourceAsStream funktioniert nicht für jede Klasse?

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; 
     } 
    } 
} 

Dieser Code funktioniert einwandfrei.

Problem ist, wenn ich Klasse A als extends java.io.File definieren, ist der InputStream, den ich von getResourceAsStream bekomme, Null.

Auch, wenn ich Klasse A als reguläre Klasse verlassen (wird nicht vererbt) und Klasse B definieren als:

Class B extends java.io.File 
{ 
    public InputStream getInputStream(String path) throws Exception 
    { 
    return new A().getInputStream(path); 
} 
} 

der zurückInput noch null ist.

Was ist das Problem? Gibt es eine Möglichkeit, auf die Datei von der Klasse zuzugreifen, die File erbt?

Danke,

Antwort

10

Ich vermute, das mit Paketen mehr als Erbe zu tun.

Wenn Ihre Klasse in einem Paket ist, dann wird getResourceAsStream() relativ zu diesem Paket sein, es sei denn, Sie starten es mit "/" (was es zu einer "absoluten" Ressource macht). Eine Alternative ist die Verwendung von getClass().getClassLoader().getResourceAsStream(), die keine Ahnung davon hat, dass ein Pfad relativ zu einem Paket ist.

Nur Unterklasse File sollte das Verhalten überhaupt nicht beeinflussen. Wenn Sie es wirklich glauben, senden Sie bitte ein kurzes, aber vollständiges Programm, um das Problem zu demonstrieren.

+0

Sie haben Recht. Das Problem war anders. Siehe meine Antwort. Vielen Dank! – Dikla

0

Entschuldigung, das Problem ist anders. (Kein Problem eigentlich ...)

In der Klasse, die von java.io.File geerbt habe ich getPath() verwendet, um den Pfad zu der Ressource zu erhalten. Aber der Pfad hatte Backslashes anstelle von regulären Schrägstrichen (da ich unter Windows OS arbeite). Wenn ich normale Schrägstriche verwendete, funktionierte es sogar, wenn die geerbte Klasse verwendet wurde.

1

IMHO ist es immer noch besser zu getClass().getClassLoader().getResourceAsStream() zu verwenden, da der obige Code fehlschlagen kann, wenn Sie Unterklasse (und die Unterklasse ist in einem anderen Pacakge) und eine Elternmethode aufrufen.

4

Hier sind einige Beispiele, die Jon Skeet Erklärung sichern:

Premise: Sie haben eine Klasse my.package.A, die auf foo.txt abhängt.

  1. Wenn Sie my.package.A.class.getResourceAsStream ("foo.txt"), und Sie foo.txt an meinem/Paket/foo.txt in Ihrer JAR-Datei platzieren, dann, wenn Sie Klasse laufen A sollte es foo.txt finden.

  2. Wenn Sie my.package.A.class.getClassLoader(). GetResourceAsStream ("foo.txt") verwenden, dann platzieren Sie foo.txt in einem beliebigen Ordner im Klassenpfad, wenn Sie Klasse A ausführen, sollte foo gefunden werden. txt.

  3. Wenn Sie my.package.A.class.getResourceAsStream ("/ foo.txt") verwenden und Sie foo.txt in der Datei "/foo.txt" in meine JAR-Datei einfügen, sollte das Programm "A" gefunden werden foo.txt.

+0

Ich mag diese Erklärung wirklich! Vielen Dank für die Klärung ... –

Verwandte Themen