OpenJDK - FileReader throws FileNotFoundException

Status
Nicht offen für weitere Antworten.

Charas

Mitglied
Hallo,

bei folgendem Code:

Java:
File coordinatesFile = new File(
                                MainApp.class.getProtectionDomain().getCodeSource().getLocation().toString(),
				"HeartResources" + System.getProperty("file.separator") + "coordinatesInfo.txt");

if(coordinatesFile.exists()) throw new Exception("Heart resource file " + coordinatesFile.getName() +" is missing!");

FileReader reader = new FileReader(coordinatesFile);

schmeißt der FileReader mir folgende Exception:

Java:
java.io.FileNotFoundException: file:/home/edi/workspaces_eclipse/workspace_bakk/Bakk4/bin/HeartResources/coordinatesInfo.txt (No such file or directory)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:137)
	at java.io.FileReader.<init>(FileReader.java:72)
	at WholeHeartDataContainer.<init>(WholeHeartDataContainer.java:47)
	at HeartWindow.<init>(HeartWindow.java:53)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at sun.applet.AppletPanel.createApplet(AppletPanel.java:798)
	at sun.applet.AppletPanel.runLoader(AppletPanel.java:727)
	at sun.applet.AppletPanel.run(AppletPanel.java:380)
	at java.lang.Thread.run(Thread.java:636)

Wenn ich statt des File-Objektes einen String ("/home/edi/workspaces_eclipse/workspace_bakk/Bakk4/bin/HeartResources/coordinatesInfo.txt") an den FileReader übergebe, wird keine Exception geworfen.

Hat jemand eine Idee, an was das liegen könnte?

Das ganze unter:
OS: Ubuntu 8.04
Java:
OpenJDK Runtime Environment (build 1.6.0_0-b11)
OpenJDK Server VM (build 1.6.0_0-b11, mixed mode)

Mfg
Charas
 

Charas

Mitglied
Ich übergebe dem FileReader ein File-Objekt, wie es einer seiner Konstruktoren erwartet.

Also scheint es als hätte der FileReader intern ein Problem ....

Aber was für eines .... ich lese da leider aus dem Stack-Trace nichts heraus und hoffte einer von euch vielleicht schon ...
 
Zuletzt bearbeitet:
M

maki

Gast
Es geht nicht um ein file obejkt, sondern um die Zeichenkette [c]file:[/c].

Das liegt an dieser Zeile:
Java:
class.getProtectionDomain().getCodeSource().getLocation().toString()
getLocation liefert eine URL, man sollte nie versuchen eine URL direkt in einen String zu wandeln, immer erst über URI gehen ;)
 
M

maki

Gast
Moment, denke dass das nicht den Problem war, habs selber gerade getestet...

Nachtarg: Doch doch, die, so geht's:
Java:
new File(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI());
 
Zuletzt bearbeitet von einem Moderator:

Charas

Mitglied
hmm .... ok

stecke eh gerade beim versuch über ein URI-Object zu gehen ^^

über Vorschläge bin ich weiterhin dankbar .... falls ich selber auf die Lösung komme poste ich sie natürlich

@maki
übergib das File mal an einen FileReader ... der wirft mir dann eine Exception
 
Zuletzt bearbeitet:

Charas

Mitglied
Java:
		System.out.println(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI());

da ist die Ausgabe immer noch

file:/home/edi/workspaces_eclipse/workspace_bakk/Bakk4/bin/

Glaube ich mache das so:

Java:
File coordinatesFile = new File(
				MainApp.class.getProtectionDomain().getCodeSource().getLocation().toString(),
				"HeartResources" + System.getProperty("file.separator") + "coordinatesInfo.txt");

if(coordinatesFile.exists()) throw new Exception("Heart resource file " + coordinatesFile.getName() +" is missing!");

if(coordinatesFile.isFile()) {

FileReader reader = new FileReader(coordinatesFile.getAbsolutePath.toString().substring(5));

}

Jemand eine einfachere Idee ;)
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Moment mal... du benutzt ja einen Reader. Dann kann der Code so keinen Sinn machen:
Java:
if(coordinatesFile.exists()) throw new Exception("Heart resource file " + coordinatesFile.getName() +" is missing!");
 
FileReader reader = new FileReader(coordinatesFile);
Wenn die Datei existiert wirfst du eine Exception, wenn nicht, hat der Reader doch auch nichts zu lesen...
 

Charas

Mitglied
Aja mein Fehler, dass "!" habe ich nur mal zu Testzwecken herausgenommen, war vorher schon auf

Java:
if(!coordinatesFile.exists()) throw new Exception("Heart resource file " + coordinatesFile.getName() +" is missing!");
 
M

maki

Gast
da ist die Ausgabe immer noch
Natürlich, ist ja auch die toString Methode die aufgerufen wird.
File hat nicht umsonst einen URI Konstruktor, so wie in meinem Beispiel oben ;)
Versuche es doch mal so:
Java:
System.out.println(new File(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI()).toString());
 

Charas

Mitglied
@maki

your the man ;) jetzt funzt's

Java:
File coordinatesFile = new File(
                                       new File(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI()),
                                       "HeartResources" + System.getProperty("file.separator") + "coordinatesInfo.txt");
 
if(coordinatesFile.exists()) throw new Exception("Heart resource file " + coordinatesFile.getName() +" is missing!");
 
FileReader reader = new FileReader(coordinatesFile);

PS:

Noch ne Frage:

Ich habe, wie oben ersichtlich ist, im bin-Ordner einen Ordner "HeartResources" angelegt, der Geometry-Daten für mein Prog beinhaltet.

In .NET gibt es eingebettete Ressourcen die man direkt in die Assemblies einbetten kann. Kann man in JAVA Resourcen, die das Programm vorraussetzt auch in jar-Archive einbetten oder ist mein obig gewählter Weg schon der richtige? (beste?)
 
M

maki

Gast
Ich habe, wie oben ersichtlich ist, im bin-Ordner einen Ordner "HeartResources" angelegt, der Geometry-Daten für mein Prog beinhaltet.
Solltest du nicht machen, der wird bei einem clean gelöscht.
Ins bin Verzeichnis schreibt nur Eclipse, nie du ;)
Am besten einen extra Ressourcen Ordner anlegen und dafür sorgen, dass der Inhalt nach bin kopiert wird.
k.A. wie man das direkt in Eclipse einstellt, hab sowas nur mit Ant & Maven gemacht, aber Wildcard weiss es bestimmt ;)

In .NET gibt es eingebettete Ressourcen die man direkt in die Assemblies einbetten kann. Kann man in JAVA Resourcen, die das Programm vorraussetzt auch in jar-Archive einbetten oder ist mein obig gewählter Weg schon der richtige? (beste?)
Ja klar :D

Dann solltest du aber nicht über File gehen, sondern über Ressourcen. (getRessourceAsStream, getResource).
 

Wildcard

Top Contributor
k.A. wie man das direkt in Eclipse einstellt, hab sowas nur mit Ant & Maven gemacht, aber Wildcard weiss es bestimmt ;)
Erstell einfach ein Verzeichnis im Projekt Root (zB resource). Dort kopierst du dein Zeug rein. Dann Rechtsklick auf das Verzeichnis -> Build Path -> Use as Source Folder
 
U

Unregistriert

Gast
danke funktioniert 1A

Java:
File tmpFile = new File(getClass().getResource("coordinatesInfo.txt").toURI());
FileReader reader = new FileReader(tmpFile);
 

Wildcard

Top Contributor
Nein, so nicht. In jars sind Jar (Zip) Entries, keine Dateien. Du darfst die File API nicht verwenden. Stattdessen arbeitest du mit URLs und InputStreams. Also: Statt FileReader nimmst du zB einen InputStreamReader und das 'new File' entfernst du vorher.
 

Charas

Mitglied
ok, hab ich gemacht ....

ist mir ja auch einleuchtend, jetzt wo du es gesagst hasst aber trotzdem komisch, dass das funktioniert hat.

Neuer Code:

Java:
InputStreamReader reader = new InputStreamReader(getClass().getResourceAsStream("coordinatesInfo.txt"));

Thx
Charas

Edit: Ok musste ja funktionieren, da ja ja FileReader von InputStreamReader erbt ....
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Nein, das hat nur funktioniert weil in deiner IDE die Resourcen tatsächlich als Dateien vorliegen. Sobald du das Ding als jar auslieferst funktioniert es mit dem FileReader nicht mehr.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
P JDK installieren OpenJDK: Lizenz von mit JLINK erzeugten Executables Allgemeine Java-Themen 1
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
D Vergleich OracleJDK/OpenJDK Allgemeine Java-Themen 7
R JDK installieren OpenJDK-Aufruf sehr langsam Allgemeine Java-Themen 4
R JDK installieren OpenJDK druckt falsch Allgemeine Java-Themen 3
Blender3D Linzensen OpenJDK ist die kommerzielle Nutzung kostenfrei? Allgemeine Java-Themen 3
M OpenJDK Allgemeine Java-Themen 1
G UnterSchied OpenJDK vs JDK Allgemeine Java-Themen 11
C Darstellungsproblem unter Debian und OpenJDK Allgemeine Java-Themen 5
S jdk versus openjdk - Optimierung von Konstanten? Allgemeine Java-Themen 8
C OpenJDK Allgemeine Java-Themen 4
Master3000 JAVA Filereader Allgemeine Java-Themen 18
S FileReader-Problem in Eclipse Allgemeine Java-Themen 8
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
S Input/Output FileReader UTF-8 Datei Allgemeine Java-Themen 7
K FileWriter / FileReader Allgemeine Java-Themen 12
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
G Kopie eines FileReader Allgemeine Java-Themen 4
U Filereader problem Allgemeine Java-Themen 2
S was passiert bei diesem filereader prozess Allgemeine Java-Themen 2
B HTML und FileReader Allgemeine Java-Themen 2
H Dateien lesen und schreiben mit Filereader und Filewriter Allgemeine Java-Themen 2
S FileReader Methode nach Zeilen. Allgemeine Java-Themen 2
V Designfrage: try-catch-throws Allgemeine Java-Themen 11
D Throws Exceptions Allgemeine Java-Themen 14
S was bedeutet: throws IOException Allgemeine Java-Themen 1
U throws exception . Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben