2009-03-11 24 views
4

Okay, ich versuche, eine Datei in Java mit diesem Code zu laden:Datei nicht gefunden. Warum nicht?

String file = "map.mp"; 
URL url = this.getClass().getResource(file); 
System.out.println("url = " + url); 
FileInputStream x = new FileInputStream("" + url); 

und trotz der Datei im selben Ordner wie die Klasse es sagt ist es es nicht finden kann (ja, es ist in einem Versuch catch Block im vollständigen Code).

jedoch findet es eine andere Datei mit dem gleichen Code mit einem anderen Namen:

URL url = this.getClass().getResource("default.png"); 
System.out.println("url2 = " + this.getClass().getResource("default.png")); 
BufferedImage img = ImageIO.read(url); 

Warum kann mein Code nicht meine map.mp Datei finden?

+1

Zu einem völlig unabhängigen Hinweis, url.toString() ist viel effizienter (und schöner) als "" + URL. –

+0

Sollten wir annehmen, dass es eine FileNotFoundException auslöst? – Powerlord

+0

Also was wird ausgedruckt, wenn Sie das ausführen? Ich vermute das Problem ist, dass FileInputStream keine URLs mag. –

Antwort

18

Sie versuchen, eine URL zu verwenden, als wäre es ein Dateiname. Es wird nicht sein. Es wird etwas sein, beginnend mit file://. In anderen Bereitstellungsszenarien ist möglicherweise keine Datei zum Öffnen vorhanden, z. B. in einer JAR-Datei. Sie können URL.getFile() verwenden, wenn Sie wirklich, wirklich müssen - aber es ist besser, nicht zu.

Verwenden Sie getResourceAsStream anstelle von getResource() - das gibt Ihnen eine InputStream direkt. Alternativ können Sie weiterhin getResource() verwenden, wenn Sie die URL für etwas anderes benötigen, aber dann URL.openStream() verwenden, um an die Daten zu gelangen.

+0

Was war der Grund, warum die erste FnFE die zweite nicht beendet? – OscarRyz

+0

Die zweite verwendet ImageIO.read(), die eine URL nimmt. –

4

FileInputStream nimmt einen Dateinamen als Parameter, keine URL-Zeichenfolge.

Der übliche Weg, auf den Inhalt zu kommen, den ein URL zeigt, ist mit openStream. Sie können einen Stream für eine Ressource öffnen, ohne eine URL selbst mit Class/ClassLoader.getResourceAsStream (es öffnet die URL innerhalb der Implementierung) zu berühren.

Alternativ können Sie Datei URLs mit öffnen:

InputStream in = FileInputStream(new File(url.toURI())); 

Für eine Ressource würde dies erfordern, dass Sie rohe Class-Dateien außerhalb einer JAR-Datei auf Ihrem Dateisystem haben. JNLP (Java WebStart) hat eine API zum Öffnen von Dateien ist eine sichere Art und Weise.

Im Allgemeinen: Wenn Sie zu einem String konvertieren, verwenden Sie toString oder String.valueOf, um klar zu sein, was Sie tun. Beachten Sie auch, dass String etwas schwach typisiert ist, da der Typ keinen Hinweis auf das Format der enthaltenen Daten gibt, also bevorzugen Sie beispielsweise URI oder File.

+0

Wie kann ich eine Datei richtig laden? Dies geht in ein Java Web Start Jar. – William

0

Versuchen Sie festzustellen, ob die Datei, auf die Sie zugreifen möchten, gefunden wird oder die gewünschte Datei. Verwenden Sie Sys internals File Monitor. Es hilft zu überwachen, auf welche Dateien von der SO zugegriffen wurde.

0

Haben Sie einen Platz auf Ihrem Weg? Siehst du eine% 20? Entferne das. Dann wird dies funktionieren: getResource (Datei) genau wie getResourceAsStream().

Räume sind in Pfaden böse. Vermeide sie immer.