Christian Seiler: Das System kann die Datei nicht finden

Beitrag lesen

Hallo,

Öhm, dazu noch ne weitere Frage: Ist in Deiner Klasse die main-Methode enthalten (d.h. wird diese direkt aufgerufen) oder wird die Klasse nur von einem anderen Teil der Software verwendet? Wenn ich das weiß, kann ich Dir auch folgende Frage beantworten:

Ich habe die Main-Methode und den Code zu Auslesen in einer Klasse stehen (nur zum Testen so gemacht, später werde ich die
Main entfernen). Wenn ich das Programm aus einer anderer Klasse heraus aufrufe, ändert sich nichts. Die Datei wird nicht gefunden.

Oh, das ist natürlich irgendwie doof.

Denn: Du kannst mittels getResource / getResourceAsStream (wie Daniel vorschlug) durchaus Resourcen relativ zum Classpath auflösen.

Wenn Du allerdings Deine Klasse in einem Unterverzeichnis hast und dort testhalber main() reintust, dann wird Eclipse den Classpath beim Ausführen automatsich auf Dein Unterverzeichnis setzen - sprich: Du kannst das dann auflösen.

Wenn Du Deine Klasse dagegen nur als Teil eines Pakets verwendest und von einer anderen Klasse in einem höherliegenden Verzeichnis aufrufst, dann ist der Classpath beim Ausführen auf das höherliegende Verzeichnis gesetzt und die Klasse, die Deine Klasse aufruft, ruft diese ja über a.b.c.Klasse auf, wobei das im Dateisystem dann als a/b/c/Klasse.class aufgelöst wird.

Wenn Du relativ zum Classpath was auflösen willst, dann kannst Du folgendes verwenden:

java.net.URL url = getClass ().getResource ("relativer/pfad/vom/Classpath/aus/zu/datei.txt");  
if (url == null) { // nicht gefunden  
  // ...  
} else {  
  // ne datei draus machen  
  java.io.File file = new java.io.File (url);  
}

Das bringt Dir aber wie gesagt nur dann einen Pfad relativ zu Deiner Klasse, wenn Deine Klasse direkt im Classpath hockt und nicht noch in einem Paket ist (d.h. am Anfang der Datei package a.b.c; steht).

Und wenn Du das ganze noch in eine *.jar packst, dann hast Du ganz verloren, dann funktioniert der obige Code zum einen nicht mehr (weil new File (url) davon ausgeht, dass url mit file:/// anfängt und wenn das nicht der Fall ist, gibt's ne schöne Exception) und zum anderen kannst Du dann nur noch lesend auf die Resource zugreifen (indem Du Dir z.B. analog über getResourceAsStream () einen InputStream zurückgeben lässt). Schreiben kannst Du aber auf Dinge in *.jar-Dateien nicht. Sagte aber Daniel hier im Thread bereits schon.

Viele Grüße,
Christian