Fonctionnalité printf () en Java combinée avec un CharBuffer ou quelque chose de similaire

StackOverflow https://stackoverflow.com/questions/407026

  •  03-07-2019
  •  | 
  •  

Question

Je suis un peu confus ici.

J'aimerais faire quelque chose comme ça:

  1. créer une sorte de tampon dans lequel je peux écrire
  2. vider le tampon
  3. utilisez plusieurs fois une fonction semblable à printf () pour ajouter plusieurs éléments dans la mémoire tampon à partir de calculs compliqués que je ne souhaite effectuer qu'une seule fois
  4. utilisez le contenu du tampon et imprimez-le sur plusieurs objets PrintStream
  5. répétez les étapes 2 à 4 si nécessaire

exemple:

SuperBuffer sb = new SuperBuffer();
  /* SuperBuffer is not a real class, so I don't know what to use here */
PrintStream[] streams = new PrintStream[N];
/* ... initialize this array to several streams ... */

while (!done)
{
    sb.clear();
    sb.printf("something %d something %d something %d", 
        value1, value2, value3);
    if (some_complicated_condition())
        sb.printf("something else %d something else %d", value4, value5);
    /* ... more printfs to sb ... */
    for (PrintStream ps : streams)
        ps.println(sb.getBuffer());
}

Cela ressemble à un PrintWriter aux alentours de StringWriter fais ce que je veux pour l'objet sb ci-dessus, sauf qu'il n'y a pas de méthode clear () . Je suppose que je pourrais créer un nouvel objet PrintWriter et StringWriter à chaque fois dans la boucle, mais cela semble être une douleur. (Dans mon vrai code, je le fais à plusieurs endroits, pas seulement une fois dans une boucle ...)

J'ai également beaucoup utilisé java.nio.CharBuffer et d'autres tampons NIO, et cela semble être une approche prometteuse, mais je ne suis pas sûr de pouvoir les envelopper avec un objet me donnera la fonctionnalité printf () .

des conseils?

Était-ce utile?

La solution

ah: je pense l'avoir. Le Formateur class a une méthode format () similaire à printf () , et elle peut être construite pour englober tout type d’objet implémentant Appendable . CharBuffer implémente Appendable , et je peux clear () ou lire le contenu du CharBuffer si nécessaire.

Autres conseils

Pourquoi est-ce difficile de créer un nouveau tampon dans la boucle? C'est ce que le ramasse-miettes est là. Il faudrait de toute façon une nouvelle allocation sous les couvertures de clear ().

Si vous voulez vraiment implémenter votre SuperBuffer, ce ne sera pas si difficile du tout. Créez simplement une sous-classe de OutputStream avec une fonction clear (), puis enroulez un PrintStream autour de cela. Vous pouvez utiliser un CharBuffer dans votre super tampon si vous le souhaitez.

Envisagez de créer une sous-classe, TeeOutputStream, de OutputStream (ou Writer) qui contiendra votre tableau de flux et de délégués. Enveloppez ensuite votre flux avec un PrintStream (ou PrintWriter) et appelez simplement printf () dessus. Pas besoin de tampon temporaire ou quoi que ce soit:

PrintStream[] streams = new PrintStream[N]; // any output streams really
PrintStream ps = new PrintStream(new TeeOutputStream(streams));

while (!done)
{
    ps.printf("something %d something %d something %d",
              value1, value2, value3);    
    if (some_complicated_condition())
        ps.printf("something else %d something else %d", value4, value5);
    ps.println();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top