Как преобразовать PrintWriter в String или записать в файл?
Я создаю динамическую страницу с помощью JSP, я хочу сохранить эту динамически сгенерированную полную страницу в файле как архив.
В JSP все записывается в PrintWriter out = response.getWriter();
В конце страницы перед отправкой ответа клиенту я хочу сохранить эту страницу в файле или в буфере как строку для последующего лечения.
Как сохранить содержимое Printwriter
или преобразовать в String
?
Ответы
Ответ 1
Это будет зависеть от того, как создается и затем используется PrintWriter.
Если PrintWriter сконструирован 1-й, а затем передан в код, который записывается на него, вы можете использовать шаблон Decorator, который позволяет создать подкласс класса 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();
}
}
Ответ 2
Почему бы не использовать StringWriter
вместо этого? Я думаю, что это должно быть в состоянии обеспечить то, что вам нужно.
Итак, например:
StringWriter strOut = new StringWriter();
...
String output = strOut.toString();
System.out.println(output);
Ответ 3
Чтобы получить строку из вывода 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);
}
Ответ 4
Вы не можете получить его только с помощью своего объекта PrintWriter
. Он очищает данные и не содержит содержания в себе. Это не тот объект, который вы должны искать, чтобы получить всю строку,
Ответ 5
Лучший способ, по моему мнению, подготовить ответ в других объектах, таких как StringBuffer, и добавить его содержимое в ответ и после сохранения содержимого, хранящегося в этой переменной, в файл.
Ответ 6
В отличие от того, что делает cdc, вы можете расширить 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();
}
}
Ответ 7
Это помогло мне: получить SOAP-способный объект как строку XML.
JAXBContext jc = JAXBContext.newInstance(o.getClass());
Marshaller m = jc.createMarshaller();
StringWriter writer = new StringWriter();
m.marshal( o, new PrintWriter(writer) );
return writer.toString();