web-dev-qa-db-fra.com

comment convertir PrintWriter en chaîne ou écrire dans un fichier?

Je génère une page dynamique à l'aide de JSP, je souhaite enregistrer cette page complète générée de manière dynamique dans un fichier sous forme d'archive.

Dans JSP, tout est écrit dans PrintWriter out = response.getWriter();

À la fin de la page, avant d'envoyer une réponse au client, je souhaite enregistrer cette page, soit dans un fichier, soit dans une mémoire tampon sous forme de chaîne pour un traitement ultérieur.

Comment enregistrer du contenu Printwriter ou convertir en String?

15
superzoom

Cela dépendra de la manière dont le PrintWriter est construit puis utilisé.

Si le PrintWriter est construit en premier, puis transmis au code qui l’écrit, vous pouvez utiliser le motif Decorator qui vous permet de créer une sous-classe de Writer, qui prend le PrintWriter en tant que délégué et transfère les appels au délégué, mais conserve également une copie du contenu que vous pouvez ensuite archiver.

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();
   }
}
5
cdc

Pour obtenir une chaîne à partir de la sortie d'une PrintWriter, vous pouvez passer une StringWriter à une PrintWriter via le constructeur:

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

Pourquoi ne pas utiliser StringWriter à la place? Je pense que cela devrait être en mesure de fournir ce dont vous avez besoin.

Donc par exemple:

StringWriter strOut = new StringWriter();
...
String output = strOut.toString();
System.out.println(output);
9
Alvin Bunk

Vous ne pouvez pas l'obtenir uniquement avec votre objet PrintWriter. Il vide les données et ne contient aucun contenu en lui-même. Ce n'est pas l'objet que vous devriez regarder pour obtenir la chaîne entière,

1
Navneeth G

Dans le même esprit que cdc, vous pouvez étendre PrintWriter, puis créer et faire passer une instance de cette nouvelle classe.

Appelez getArchive() pour obtenir une copie des données transmises par le rédacteur.

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
Will Calderwood

La meilleure façon, selon moi, est de préparer votre réponse dans un autre objet, tel que StringBuffer, et d'ajuster son contenu à la réponse, puis de sauvegarder le contenu stocké dans cette variable dans le fichier.

0
Rigoni