Wie man Java-Datei absoluten Pfad von InputStream?
Bin ich auf Java 6 und ich haben eine Methode, die durchsucht das Laufzeit-classpath nach einer Datei namens config.xml
. Wenn gefunden, die ich Lesen möchte, den Inhalt der Datei in einen string:
InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
if(istream != null) {
System.out.println("Found config.xml!");
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(fileName));
char[] buf = new char[1024];
int numRead = 0;
while((numRead=reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
reader.close();
}
} catch (FileNotFoundException fnfExc) {
throw new RuntimeException("FileNotFoundException: " + fnfExc.getMessage());
} catch (IOException ioExc) {
throw new RuntimeException("IOException: " + ioExc.getMessage());
}
}
Wenn ich diesen code ausführen möchte, bekomme ich folgende Ausgabe in der Konsole:
Found config.xml!
Exception in thread "main" java.lang.RuntimeException: FileNotFoundException: config.xml (No such file or directory)
at com.me.myapp.Configurator.readConfigFileFromClasspath(Configurator.java:556)
at com.me.myapp.Configurator.<init>(Configurator.java:34)
...rest of stack trace omitted for brevity
Also der classpath-scan für config.xml
erfolgreich ist, aber dann kann der Leser nicht scheinen, um die Datei zu suchen. Warum??? Meine einzige Theorie ist, dass, wenn config.xml
finden Sie auf den classpath, enthalten nicht den absoluten Pfad zum Speicherort der Datei auf dem system, und vielleicht ist es das, was den Leser-code gesucht wird.
Haben Sie versucht
Warum nicht einfach Lesen gerade aus
this.getClass().getResourceAsStream("config.xml")
?Warum nicht einfach Lesen gerade aus
istream
?InformationsquelleAutor | 2013-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Von Ihr gegebenen Beispiel ist es nicht klar, was
fileName
verweist. Sie sollten benutzen Sie einfach den stream ein, die Sie vongetResourceAsStream()
Lesen Sie die Datei, etwas zusammenUnd Sie sollten es vermeiden, wiederholt die Zuweisung
buf
neue für jeden lese-Zyklus, einmal ist genug.InformationsquelleAutor Gyro Gearless
Verwenden Sie eine Ressource von einem classloader.
Statt:
tun:
Dass eine URL mit dem Pfad (Nutzung
.toURI().getPath()
). Zu öffnen, die passenden input-stream anschließend verwenden.openStream()
.Weiß man wenigstens, dass die Ressource vorhanden ist: wenn es nicht klappt,
.getResource{,AsStream}()
beide zurücknull
(statt werfen eine IOException aus, was zweifelhaft ist imho)Ihre URL-Lösung hat mir geholfen, es funktioniert, wenn Sie nicht geben Sie den Kontext loader.
InformationsquelleAutor fge