Как конвертировать PrintWriter в строку или записать в файл? - PullRequest
15 голосов
/ 10 февраля 2012

Я генерирую динамическую страницу, используя JSP, я хочу сохранить эту динамически сгенерированную полную страницу в файл как архив.

В JSP все записано в PrintWriter out = response.getWriter();

В конце страницы, перед отправкой ответа клиенту, я хочу сохранить эту страницу, либо в файле, либо в буфере в виде строки для последующей обработки.

Как я могу сохранить Printwriter контент или преобразовать в String?

Ответы [ 7 ]

19 голосов
/ 01 марта 2017

Чтобы получить строку из вывода 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);
}
9 голосов
/ 20 марта 2013

Почему бы не использовать StringWriter вместо этого?Я думаю, что это должно быть в состоянии предоставить то, что вам нужно.

Так, например:

StringWriter strOut = new StringWriter();
...
String output = strOut.toString();
System.out.println(output);
5 голосов
/ 10 февраля 2012

Это будет зависеть от: как конструируется PrintWriter, а затем используется.

Если PrintWriter сконструирован первым и затем передан в код, который записывает в него, вы можете использовать шаблон 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();
   }
}
1 голос
/ 10 февраля 2012

Вы не можете получить его только с вашим PrintWriter объектом.Он сбрасывает данные и не содержит никакого содержимого внутри себя.Это не тот объект, на который вы должны смотреть, чтобы получить всю строку,

0 голосов
/ 11 августа 2016

Аналогично тому, что делает 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();
    }
}
0 голосов
/ 08 августа 2013

Это помогло мне: для получения 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();
0 голосов
/ 10 февраля 2012

На мой взгляд, лучший способ - подготовить ответ в другом объекте, например StringBuffer, и перенести его содержимое в ответ, а затем сохранить содержимое, хранящееся в этой переменной, в файл.

...