2012-02-10 11 views
14

Sto generando una pagina dinamica usando JSP, voglio salvare questa pagina completa generata dinamicamente nel file come archivio.come convertire PrintWriter in stringa o scrivere in un file?

In JSP, tutto è scritto a PrintWriter out = response.getWriter();

Alla fine della pagina, prima di inviare la risposta al cliente che voglio salvare questa pagina, sia in file o in un tampone come stringa per il trattamento in seguito.

Come posso salvare il contenuto Printwriter o convertirlo in String?

+0

si prega di controllare le risposte per la seguente questione. http://stackoverflow.com/questions/2010990/how-do-you-return-a-json-object-from-a-java-servlet – Raj

+0

Grazie Raj, ma questo non è quello che sto cercando, client will vedere normale html, ma sul lato server, lo script creerà la copia locale e scriverà nel file. – superzoom

+0

possibile duplicato di [Come registrare il contenuto della risposta da un server web java] (http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server) – BalusC

risposta

6

Dipenderà da: come è stato creato e quindi utilizzato PrintWriter.

Se PrintWriter è costruito prima e quindi passato al codice che lo scrive, è possibile utilizzare il pattern Decorator che consente di creare una sottoclasse di Writer, che accetta PrintWriter come delegato e inoltra le chiamate a il delegato, ma mantiene anche una copia del contenuto che è possibile archiviare.

public class DecoratedWriter extends Writer 
{ 
    private final Writer delegate; 

    private final StringWriter archive = new StringWriter(); 

    //pass in the original PrintWriter here 
    public DecoratedWriter(Writer delegate) 
    { 
     this.delegate = delegate; 
    } 

    public String getForArchive() 
    { 
     return this.archive.toString(); 
    } 

    public void write(char[] cbuf, int off, int len) throws IOException 
    { 
     this.delegate.write(cbuf, off, len); 
     this.archive.write(cbuf, off, len); 
    } 

    public void flush() throws IOException 
    { 
     this.delegate.flush(); 
     this.archive.flush(); 

    } 

    public void close() throws IOException 
    { 
     this.delegate.close(); 
     this.archive.close(); 
    } 
} 
+0

Java: non perdere mai una buona occasione per scrivere 36 righe per (quasi) nulla! –

1

Non è possibile ottenerlo con il proprio oggetto PrintWriter. Elimina i dati e non contiene alcun contenuto al suo interno. Questo non è l'oggetto che dovresti guardare per ottenere l'intera stringa,

+0

Grazie Navneeth Gopalakrishnan, se non posso usare Printwriter, allora quale opzione ho a disposizione? E l'oggetto risposta? Perché tutto sta passando attraverso la risposta al cliente !!! – superzoom

+1

Puoi scrivere cose che vuoi scrivere in uno StringWriter e infine quando tutto è fatto, puoi scriverlo anche allo scrittore della risposta. In questo modo hai i dati che hai scritto che possono essere utilizzati per altri scopi. –

+0

Quando intendo scrivere, volevo dire, scaricare anche il contenuto di StringWriter sul tuo 'response.getWriter()'. –

0

Il modo migliore credo sia preparare la vostra risposta a un altro oggetto, come StringBuffer e fush il suo contenuto alla risposta, e dopo salvare il contenuto memorizzato in quella variabile al file.

7

Perché non utilizzare StringWriter? Penso che questo dovrebbe essere in grado di fornire ciò di cui hai bisogno.

Così, per esempio:

StringWriter strOut = new StringWriter(); 
... 
String output = strOut.toString(); 
System.out.println(output); 
-1

Questo mi ha aiutato: per ottenere un oggetto SOAP-grado come stringa XML.

JAXBContext jc = JAXBContext.newInstance(o.getClass()); 
Marshaller m = jc.createMarshaller(); 
StringWriter writer = new StringWriter(); 
m.marshal(o, new PrintWriter(writer)); 
return writer.toString(); 
+2

Questo è assolutamente spazzatura e senza senso. –

+0

Com'è questa "spazzatura" o "assurdità"? Non capisco. – Jubz

0

lungo linee simili a quello che sta facendo cdc - è possibile estendere PrintWriter e quindi creare e passare intorno un'istanza di questa nuova classe.

Chiama getArchive() per ottenere una copia dei dati che sono passati attraverso il writer.

public class ArchiveWriter extends PrintWriter { 
    private StringBuilder data = new StringBuilder(); 

    public ArchiveWriter(Writer out) { 
     super(out); 
    } 

    public ArchiveWriter(Writer out, boolean autoFlush) { 
     super(out, autoFlush); 
    } 

    public ArchiveWriter(OutputStream out) { 
     super(out); 
    } 

    public ArchiveWriter(OutputStream out, boolean autoFlush) { 
     super(out, autoFlush); 
    } 

    public ArchiveWriter(String fileName) throws FileNotFoundException { 
     super(fileName); 
    } 

    public ArchiveWriter(String fileName, String csn) throws FileNotFoundException, UnsupportedEncodingException { 
     super(fileName, csn); 
    } 

    public ArchiveWriter(File file) throws FileNotFoundException { 
     super(file); 
    } 

    public ArchiveWriter(File file, String csn) throws FileNotFoundException, UnsupportedEncodingException { 
     super(file, csn); 
    } 

    @Override 
    public void write(char[] cbuf, int off, int len) { 
     super.write(cbuf, off,len); 
     data.append(cbuf, off, len); 
    } 

    @Override 
    public void write(String s, int off, int len) { 
     super.write(s, off,len); 
     data.append(s, off, len); 
    } 

    public String getArchive() { 
     return data.toString(); 
    } 
} 
4

Per ottenere una stringa da l'uscita di un PrintWriter, è possibile passare un StringWriter ad un PrintWriter tramite il costruttore:

@Test 
public void writerTest(){ 
    StringWriter out = new StringWriter(); 
    PrintWriter writer = new PrintWriter(out); 

    // use writer, e.g.: 
    writer.print("ABC"); 
    writer.print("DEF"); 

    writer.flush(); // flush is really optional here, as Writer calls the empty StringWriter.flush 
    String result = out.toString(); 

    assertEquals("ABCDEF", result); 
}