Wie funktioniert getResourceAsStream beim Debuggen von Java in Eclipse?

7

Das ist verwirrend ... Ich kann getResource () und getResourceAsStream () ordnungsgemäß ausführen, wenn ich Java auf meiner gepackten JAR-Datei ausführen, die eine Textdatei enthält. (Als Referenz siehe die Sun-Dokumentation auf Ressourcen zugreifen ) Ich kann ' Es scheint, dass das gleiche Programm ordnungsgemäß funktioniert, wenn ich es in Eclipse ausführe, obwohl ich meine Textdatei in die gleiche Baumstruktur wie meine kompilierten .class-Dateien

gestellt habe

Kann einer von Ihnen mich auf irgendwelche Feinheiten hinweisen, um sicherzustellen, dass die Funktionen getResource () und getResourceAsStream () richtig funktionieren?

Ich habe eine Ahnung, dass es mit CLASSPATH zu tun hat und / oder wo Eclipse die .class-Dateien autocompiliert. (Ich habe festgestellt, dass bei der Ausführung von Ant alle Java-Dateien kompiliert werden, die sich seit meinem letzten Ant-Build geändert haben, obwohl Eclipse diese Java-Dateien bereits kompiliert hat.)

    
Jason S 17.04.2009, 15:01
quelle

6 Antworten

10

Wenn Sie Ihre Textdatei zusammen mit Ihren Quelldateien speichern, kopiert Eclipse sie dorthin, wo sie ihre kompilierten .class-Dateien ablegt. So sehen Sie Ihre Textdatei, wenn Sie Ihre App von Eclipse aus starten (und Sie werden es auch tun) kann die Datei auch in Eclipse bearbeiten).

    
Chochos 17.04.2009, 15:06
quelle
16

Einige Anmerkungen:

Erstens - wie Chocos sagt, stecke es in die Quellenquellen der Sonnenfinsternis, nicht in die binären Verzeichnisse. Eclipse löscht die Binärdateien, wenn Sie "säubern", und bereinigt nicht angepasste Dateien. Es wird non-java Quelldateien in das binäre Verzeichnis kopieren.

Das bedeutet, dass Sie die Datei zwar im binären Verzeichnis ablegen, aber durch Eclipse gelöscht werden können ...

Beachten Sie, dass getResourceAsStream und getResource relativ zum Paket des Codes, der sie aufruft, operieren. Zum Beispiel:

%Vor%

Dies wird tatsächlich nach a / b / c / fee.txt suchen; Das Paket ist bereits versandt. Das funktioniert gut, wenn Sie die Datei feed.txt in demselben Quellverzeichnis wie die Datei Foo.java haben oder wenn Sie einen separaten Satz von Ressourcenverzeichnisse auf dem Klassenpfad mit derselben Verzeichnisstruktur haben.

Wenn Sie

verwenden %Vor%

es wird nach fee.txt direkt auf dem Klassenpfad suchen.

Wenn Sie über die Befehlszeile ausführen, wo ist in der JAR die Ressourcendatei? - Scott

    
Scott Stanchfield 17.04.2009 15:37
quelle
2

Das Problem wurde gefunden!

Ich habe meine Bilddateien in der Quellstruktur gespeichert. (In meinem Ant-Build kopiere ich sie in das Build-Verzeichnis)

Das Problem war, dass ich den Quellbaum in Eclipse kürzlich nicht aktualisiert hatte. Die Dateien waren also da, aber Eclipse achtete nicht auf sie.

Danke, dass du mir gesagt hast, dass Eclipse sie in meinem Quellbaum haben soll.

    
Jason S 17.04.2009 15:53
quelle
1
  

Ich habe eine Ahnung, dass es mit CLASSPATH zu tun hat und / oder wo Eclipse die .class-Dateien autocompiliert.

Gehen Sie in der Ausführungskonfiguration für, wie auch immer Sie Ihre Anwendung starten, auf die Registerkarte Klassenpfad, und fügen Sie den Stammordner des Pfads hinzu, den Sie für den Zugriff auf die Datei verwenden.

Wenn Sie zum Beispiel "blah / file.txt" laden möchten und die Datei sich in "folder / blah / file.txt" befindet, fügen Sie dem Klassenpfad "folder" hinzu. Wenn Sie versuchen, die Ressource nur mit "file.txt" zu laden, fügen Sie "folder / blah" hinzu.

    
matt b 17.04.2009 15:07
quelle
1

Ich hatte das gleiche Problem mit IntelliJ, die Lösung dafür war, in den Projekteinstellungen den Ordner mit den Ressourcendateien, in meinem Fall Sounddateien, als Quelle hinzuzufügen. Fügen Sie? * .wav (oder Ihren Pref-Dateityp) in Settings- & gt; Compiler-Ressourcenmuster hinzu.

    
BJF 11.10.2010 09:37
quelle
0

Was genau meinen Sie mit "richtig arbeiten"? Was ist der Fehler / das Verhalten?

Ich schlage vor, getResource zu verwenden, um die URL einer Ihrer .class -Dateien zu finden (oder ungefähr äquivalent getClass().getProtectionDomain().getCodeSource() . Sie können feststellen, dass sie irgendwo unerwartet erscheint.

    
Tom Hawtin - tackline 17.04.2009 15:07
quelle

Tags und Links