2012-11-06 11 views
6

Ich versuche eine Textdatei aus meinem Kriegsarchiv zu lesen und zeige den Inhalt zur Laufzeit auf einer Facets-Seite an. Meine Ordnerstruktur ist wie folgtEine Textdatei im Kriegsarchiv lesen

+ Kriegsarchiv> + Ressourcen> + E-Mail> + datei.txt

Ich versuche, die Datei in den Ressourcen/E-Mail/file.txt Ordnern mit dem folgenden Code zu lesen

File file = new File("/resources/email/file.txt"); 
BufferedReader reader = null; 
try { 
    reader = new BufferedReader(new FileReader(file)); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
StringBuffer buffer = new StringBuffer(); 
if (reader != null) { 
    String line = reader.readLine(); 
    while (line != null) { 
     buffer.append(line); 
     line = reader.readLine(); 
// other lines of code 

Das Problem ist jedoch, dass, wenn ich die Methode mit dem obigen Code ausgeführt wird, A FileNotFoundException geworfen wird. Ich habe auch mit der folgenden Codezeile versucht, die Datei zu erhalten, habe aber nicht

File file = new File(FacesContext.getCurrentInstance() 
     .getExternalContext().getRequestContextPath() + "/resources/email/file.txt"); 

ich immer noch die FileNotFoundException erfolgreich. Wie wird das verursacht und wie kann ich es lösen?

Antwort

17

unten Versuchen:

InputStream inputStream = 
     getClass().getClassLoader().getResourceAsStream("/resources/email/file.txt"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
8

Versuchen Sie, die Datei zu vermeiden, da dies zum Lesen von Dingen aus dem Dateisystem ist.

Da Ihre Ressource im WAR gebündelt ist, können Sie über den Klassenlader darauf zugreifen.

Stellen Sie sicher, dass die Ressource in den Ordner WEB-INF/classes gebündelt ist.

InputStream in = 
new InputStreamReader(FileLoader.class.getClassLoader().getResourceAsStream("/resources/email/file.txt")); 

Dies ist ein guter Blog zum Thema

http://haveacafe.wordpress.com/2008/10/19/how-to-read-a-file-from-jar-and-war-files-java-and-webapp-archive/

+2

Glückliche Dreifachfigur rep. :) –

+1

Danke. Eine Frage pro Tag genügt. – Tinman

+0

Ich habe mit dem obigen Beispiel versucht, ich habe die Datei in der folgenden Verzeichnisstruktur /WEBINF/classes/resources/file.txt aufgeführt. Allerdings bekomme ich immer noch die folgende Ausnahme verursacht durch: java.lang.NullPointerException bei java.io.Reader. (Unbekannte Quelle) [rt.jar: 1.7.0_04] bei java.io.InputStreamReader. (Unbekannte Quelle) [rt.jar: 1.7.0_04] bei org.xanosms.emailsender.RegistrationEmailLoader.loadFile (RegistrationEmailLoader.java:43) [Klassen:] –

3

Wenn Sie die Java-Datei-Objekt erhalten möchten, können Sie dies versuchen:

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath(); 
File f = new File(path); 
System.out.println(f.getAbsolutePath()); 
1

ziehe ich diesen Ansatz:

InputStream inputStream = getClass().getResourceAsStream("/resources/email/file.txt"); 

if (inputStream != null) { 
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { 
     ... 
    } catch ... 
} else ... 

Drei Gründe:

  • es unterstützt sowohl: Laden Ressourcen von einem absoluten Pfad und von einem relativen Pfad (ausgehend von der gegebenen Klasse) - siehe auch this answer
  • der Weg, um den Strom zu erhalten, ist ein Schritt kürzer
  • es das nutzt try-with-Ressourcen Aussage implizit den zugrunde liegenden Eingangsstrom schließen
+0

Was ist hier anders als die angenommene Antwort mit 9 upvotes ....? – Kukeltje

+0

@Kukeltje: Bitte sehe meine Bearbeitung –