2012-11-06 12 views
6

Sto cercando di leggere un file di testo dal mio archivio di guerra e di visualizzare il contenuto in una pagina facelets in fase di esecuzione. La mia struttura di cartelle è la seguenteLettura di un file di testo nell'archivio di guerra

+ archivio guerra> + risorse> + e-mail> + file.txt

cerco di leggere il file nella cartella delle risorse/email/file.txt utilizzando il seguente codice

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 

Il problema è tuttavia che quando si esegue il metodo con il codice precedente, viene generato A FileNotFoundException. Inoltre ho provato utilizzando la seguente riga di codice per ottenere il file, ma non ha avuto successo

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

ho ancora il FileNotFoundException. Come è causato e come posso risolverlo?

risposta

17

Prova di seguito:

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

Cercare di evitare il file, poiché questo è per la lettura di elementi dal file system.

Poiché la risorsa è in bundle in WAR, è possibile accedervi tramite il programma di caricamento classi.

Assicurarsi che la risorsa sia inserita nella cartella WEB-INF/classes.

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

Questo è un buon blog sul tema

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

+2

Felice rappresentante tripla cifra. :) –

+1

Grazie. Una domanda al giorno è tutto ciò che serve. – Tinman

+0

Ho provato con l'esempio precedente, ho il file elencato nella seguente struttura di directory /WEBINF/classes/resources/file.txt. Tuttavia ottengo ancora la seguente eccezione causata da: java.lang.NullPointerException su java.io.Reader. (origine sconosciuta) [rt.jar: 1.7.0_04] in java.io.InputStreamReader. (origine sconosciuta) [rt.jar: 1.7.0_04] presso org.xanosms.emailsender.RegistrationEmailLoader.loadFile (RegistrationEmailLoader.java:43) [classes:] –

3

Se si desidera ottenere l'oggetto Java file, si può provare questo:

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

Preferisco questo approccio:

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

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

Tre ragioni:

  • Supporta sia: risorse di carico da un percorso assoluto e da un percorso relativo (a partire dalla classe data) - vedi anche this answer
  • il modo per ottenere il flusso è un passo più corto
  • utilizza la dichiarazione per chiudere implicitamente il flusso di input sottostante risorse try-with-
+0

Cosa c'è di diverso qui rispetto alla risposta accettata con 9 upvotes ....? – Kukeltje

+0

@Kukeltje: Si prega di consultare la mia modifica –

Problemi correlati