2012-01-27 2 views
6

Ho un oggetto HttpServletResponse e devo scrivere un file contenuto nel jar. I seguenti segmenti di codice non funzionano per me.HttpServletResponse PrintWriter per scrivere un InputStream

URI uri = <myclass>.class.getResource("/" + filename).toURI(); 
PrintWriter out = response.getWriter(); 
File f = new File(uri); 
FileReader bis = new FileReader(f); 
char[] buff = new char[1024]; 
int bytesRead; 
// Simple read/write loop. 
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 
    out.write(buff, 0, bytesRead); 
} 

So che questo lavoro

InputStream inputStream = <myclass>.class.getResourceAsStream("/" + filename); 

ma non riesco a ottenere l'out.write PrintWriter di scrivere l'inputStream.

Qualcuno può dirmi come questo può essere fatto.

Grazie

+0

dispiace, hanno bisogno di leggere un file che è dentro il barattolo, un file di risorse. – user815809

risposta

4

risolto utilizzando la seguente

InputStream inputStream = KCSSchemaController.class.getResourceAsStream("/" + schemaname); 

OutputStream output = response.getOutputStream(); 

ByteStreams.copy(inputStream, output); 

output.flush(); 
0

necessità di scrivere un file contenuto nel vaso.

Non è possibile in questo modo. Fondamentalmente è necessario ottenere un percorso assoluto del file system del disco nel file JAR, estrarlo usando JarInputStream (un JAR è fondamentalmente un file ZIP che segue una struttura di cartelle specifica e ottiene un trattamento speciale da Java), modifica/aggiungi il file in la struttura della cartella estratta e quindi la impacchetta nuovamente usando JarOutputStream. In seguito, sarà necessario ricaricarlo utilizzando uno (personalizzato) ClassLoader se è necessario il contenuto JAR modificato successivamente durante il runtime.

Questo è comunque piuttosto complicato e non ha senso. Come alternativa completamente diversa, non tentare di modificare il JAR, ma semplicemente memorizzare i dati da qualche altra parte, ad es. su una posizione fissa sul file system del disco, o in un database, o come preferenza utente/sistema, eccetera. Quale modo di scegliere dipende dal concreto requisito funzionale che non è chiaro dalla domanda.

+0

scusa, ho bisogno di leggere un file che si trova all'interno del vaso, un file di risorse. – user815809

+0

Se hai solo bisogno di * leggerlo * (non scriverlo!), Usa 'ClassLoader # getResourseAsStream()' nel solito modo. – BalusC