2012-02-10 20 views
14

मैं जेएसपी का उपयोग कर गतिशील पृष्ठ उत्पन्न कर रहा हूं, मैं इस गतिशील रूप से जेनरेट किए गए पूर्ण पृष्ठ को फ़ाइल में संग्रह के रूप में सहेजना चाहता हूं।प्रिंटवाइटर को स्ट्रिंग में कनवर्ट करने या फ़ाइल में लिखने के लिए कैसे?

JSP में, सब कुछ या तो फाइल में या बाद में इलाज के लिए स्ट्रिंग के रूप में बफर में पृष्ठ के अंत में PrintWriter out = response.getWriter();

को लिखा है, ग्राहक को जवाब भेजने से पहले मैं इस पेज को बचाना चाहते हैं,।

मैं Printwriter सामग्री को कैसे सहेज सकता हूं या String में परिवर्तित कर सकता हूं?

+0

निम्नलिखित प्रश्न के जवाब देखें। http://stackoverflow.com/questions/2010990/how-do-you-return-a-json-object-from-a-java-servlet – Raj

+0

धन्यवाद राज, लेकिन यह नहीं कि मैं क्या देख रहा हूं, ग्राहक सामान्य एचटीएमएल देखें, लेकिन सर्वर की तरफ, स्क्रिप्ट स्थानीय प्रतिलिपि बनायेगी और फाइल में लिख जाएगी। – superzoom

+0

संभावित वेब डुप्लिकेट [जावा वेब सर्वर से प्रतिक्रिया सामग्री कैसे लॉग करें] (http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server) – BalusC

उत्तर

6

यह इस पर निर्भर करेगा: प्रिंटवाइटर का निर्माण कैसे किया जाता है और फिर इसका उपयोग किया जाता है।

यदि प्रिंटवाइटर 1 का निर्माण किया गया है और उसके बाद कोड लिखने के लिए पास किया गया है, तो आप सजावटी पैटर्न का उपयोग कर सकते हैं जो आपको लेखक के उप-वर्ग बनाने की अनुमति देता है, जो प्रिंटवाइटर को एक प्रतिनिधि के रूप में ले जाता है, और आगे कॉल करता है प्रतिनिधि, लेकिन उस सामग्री की एक प्रति भी बनाए रखता है जिसे आप संग्रहित कर सकते हैं।

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

जावा: 36 लाइनों को (लगभग) कुछ भी लिखने के लिए कभी भी अच्छा अवसर न खोएं! –

1

आप इसे अपने PrintWriter ऑब्जेक्ट से नहीं प्राप्त कर सकते हैं। यह डेटा को फ्लश करता है, और इसमें कोई भी सामग्री नहीं है। यह वह वस्तु नहीं है जिसे आप पूरी स्ट्रिंग प्राप्त करने के लिए देख रहे हैं,

+0

धन्यवाद नवनीथ गोपालकृष्णन, अगर मैं प्रिंटराइटर का उपयोग नहीं कर सकता, तो फिर मुझे कौन सा विकल्प उपलब्ध है? प्रतिक्रिया ऑब्जेक्ट के बारे में क्या? क्योंकि सब कुछ ग्राहक के जवाब के माध्यम से जा रहा है !!! – superzoom

+1

आप उन चीज़ों को लिख सकते हैं जिन्हें आप स्ट्रिंगवाइटर में लिखना चाहते हैं और आखिरकार जब सबकुछ किया जाता है, तो आप इसे रिस्पॉन्स के लेखक को भी लिख सकते हैं। इस तरह आपके पास वह डेटा है जिसे आपने लिखा है जिसे किसी अन्य उद्देश्य के लिए उपयोग किया जा सकता है। –

+0

जब मेरा मतलब लिखना है, मेरा मतलब है, स्ट्रिंगवाइटर में सामग्री को अपनी 'प्रतिक्रिया.getWriter()' पर भी फ्लश करें। –

0

सबसे अच्छा तरीका है मुझे लगता है कि StringBuffer जैसे अन्य वस्तु में अपना जवाब तैयार करना, और जवाबी कार्रवाई के लिए अपनी सामग्री fush, और फाइल करने के लिए है कि चर में संग्रहीत सामग्री को बचाने के बाद है।

7

इसके बजाय StringWriter का उपयोग क्यों नहीं करें? मुझे लगता है कि यह आपको जो चाहिए उसे प्रदान करने में सक्षम होना चाहिए।

उदाहरण के लिए

तो:

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

यह मैं मदद की: एक्सएमएल स्ट्रिंग के रूप में एक सोप करने योग्य वस्तु प्राप्त करने के लिए।

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

यह बिल्कुल बकवास और बकवास है। –

+0

यह "बकवास" या "बकवास" कैसा है? मुझे समझ में नहीं आता – Jubz

0

समान पंक्तियों के साथ क्या कर रहा है सीडीसी के लिए - आप PrintWriter का विस्तार और फिर बना सकते हैं और इस नई श्रेणी का एक उदाहरण के आसपास पारित कर सकते हैं।

लेखक के माध्यम से पारित डेटा की एक प्रति प्राप्त करने के लिए getArchive() पर कॉल करें।

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

एक PrintWriter के उत्पादन में से एक स्ट्रिंग के लिए, आप निर्माता के माध्यम से एक एक PrintWriter करने के लिए StringWriter पारित कर सकते हैं:

@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); 
}