我正在使用JSP生成动态页面,希望将完整的动态生成页面保存到文件中作为存档。
在JSP中,所有内容都是写入PrintWriter out = response.getWriter();
在向客户端发送响应之前,在页面末尾我想要保存这个页面,可以将其保存到文件中或者保存在字符串缓冲区以便以后处理。
如何保存Printwriter
的内容或将其转换为String
?
我正在使用JSP生成动态页面,希望将完整的动态生成页面保存到文件中作为存档。
在JSP中,所有内容都是写入PrintWriter out = response.getWriter();
在向客户端发送响应之前,在页面末尾我想要保存这个页面,可以将其保存到文件中或者保存在字符串缓冲区以便以后处理。
如何保存Printwriter
的内容或将其转换为String
?
要从PrintWriter
的输出中获取一个字符串,您可以通过构造函数将StringWriter
传递给PrintWriter
:
@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);
}
StringWriter
应该可以提供你所需的功能,为什么不使用它呢?StringWriter strOut = new StringWriter();
...
String output = strOut.toString();
System.out.println(output);
这将取决于:PrintWriter是如何构建和使用的。
如果先构建PrintWriter,然后传递给写入它的代码,您可以使用装饰器模式来创建一个Writer子类,将PrintWriter作为委托,并将调用转发到委托,同时还维护内容的副本,以便进行存档。
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();
}
}
你不能仅凭 PrintWriter
对象来获取它。它会刷新数据,不会在自身内部保存任何内容。这不是你应该查看以获取整个字符串的对象,
response.getWriter()
。 - Navneeth G类似于cdc所做的,您可以扩展PrintWriter
,然后创建并传递此新类的实例。
调用getArchive()
获取通过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();
}
}
JAXBContext jc = JAXBContext.newInstance(o.getClass());
Marshaller m = jc.createMarshaller();
StringWriter writer = new StringWriter();
m.marshal( o, new PrintWriter(writer) );
return writer.toString();