Datei in Jar-File wird nicht gefunden

Crian

Top Contributor
Ich habe bei mir folgende Struktur:

Code:
Projektverzeichnis
    +--src
        +--data
            +--listen
                +--meine_liste.txt

und das Laden funktioniert in Eclipse mit

Java:
        URL url = this.getClass().getClassLoader().getResource(
                "data/listen/meine_liste.txt");
        filename = url.getPath();

Ich lasse Eclipse eine ausführbare Jar-Datei erzeugen. Wenn ich mir die jar-Datei öffne, dann sehe ich auch die Struktur


Code:
Jar-Datei
    +--data
        +--listen
            +--meine_liste.txt

Trotzdem bekomme ich nach [c]java -jar my.jar[/c] den Fehler

Code:
Exception in thread "main" io.exceptions.IORuntimeException: Die Eingabedatei 'file:/C:/Users/XXX/Daten/java/myJar/my.jar!/data/listen/meine_liste.txt' existiert nicht oder ist keine normale Datei.

Hat da jemand eine Idee?

(Smartly load your properties - JavaWorld kenne ich, aber da hier das Problem ja nicht eine falsche URL oder ein falscher Dateiname ist, liegt es wohl an einer anderen Stelle.)
 
Probier mal
Java:
 URL url = this.getClass().getClassLoader().getResource(
                "/data/listen/meine_liste.txt");
Das / sorgt dafür das im Rootverzeichniss der Jar nach dem folgenden Ordner gesucht werden soll. Zumindest hab ich das so in Erinnerung 🙂
 
Wenn Data ein Sourcefolder ist nehm das Data mal raus und probier nur
Java:
this.getClass().getClassLoader().getResource(
                "/listen/meine_liste.txt");
 
Dann ist die URI wieder null. Wie gesagt, der
Code:
getResource()
findet ja die Datei. Nur kann ich sie dann nicht öffnen.
 
Poste doch mal den Code zum öffnen der Datei wo die Exception geworfen wird. Am erstellen der URL würd ich auch sagen liegts nicht. Zumindest seh ich da nichts falsches dran.
 
Der Code liegt in einer viel benutzten und erprobten Readerklasse von mir. Hier ein Ausschnitt:

[java=98] File dataFile = new File(fileName);
if (!dataFile.isFile())
throw new IORuntimeException("Die Eingabedatei '" + fileName
+ "' existiert nicht oder ist keine normale Datei.");
InputStream inputStream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(inputStream,
"ISO-8859-1");
return new LineNumberReader(reader);[/code]

Vermutlich liegt das Problem an diesem ! und daran, dass die Datei im Jar-File liegt und nicht "echt" im Dateisystem.

Ich könnte natürlich getResourceAsStream verwenden, aber dann müsste ich für diese eine Datei alles umbauen. Das wäre etwas unelegant.
 
Zuletzt bearbeitet:
Die Datei wird mit ins JAR gepackt und in einem JAR gibts keine Files mehr...

Nutze zum lesen anstelle von getResource getResourceAsStream, schreiben geht dann allerdings nicht mehr so einfach. Bei weiterem Interesse Forensuche!
 
Du arbeitest ab Zeile 103 ja mit einem InputStream. Da sollte sich das umschreiben doch in Grenzen halten.
 
Richtig, ist im JDK auch häufig so, dass es das ungefähre Schema gibt:
Java:
...
public X read(File file) {
  read(new FileInputStream(file));
}

public X read(InputStream in) {
  ...
}
...
 
Schreiben in die Jar-Datei hatte ich nicht vor. Ja, dann muss ich wohl meine Klasse so erweitern, wie von mvitz vorgeschlagen. Danke.



Edit: Kaum macht man es richtig, schon funktioniert es!
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben