Recientemente encontré un modismo que no había visto antes: ensamblado de cadenas por StringWriter y PrintWriter. Quiero decir, sé cómo usarlos, pero siempre he usado StringBuilder. ¿Hay alguna razón concreta para preferir uno sobre el otro? El método StringBuilder me parece mucho más natural, ¿pero es solo estilo?Conjunto de cadenas por StringBuilder vs StringWriter y PrintWriter
He visto varias preguntas aquí (incluida esta que es la más cercana: StringWriter or StringBuilder), pero ninguna en la que las respuestas abordan realmente la cuestión de si hay una razón para preferir una sobre otra para el montaje simple de cadenas.
Este es el idioma que he visto y usado muchas veces: el montaje de cuerda de StringBuilder:
public static String newline = System.getProperty("line.separator");
public String viaStringBuilder() {
StringBuilder builder = new StringBuilder();
builder.append("first thing").append(newline); // NOTE: avoid doing builder.append("first thing" + newline);
builder.append("second thing").append(newline);
// ... several things
builder.append("last thing").append(newline);
return builder.toString();
}
Y este es el nuevo lenguaje: el montaje de cuerda de StringWriter y PrintStream:
public String viaWriters() {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
printWriter.println("first thing");
printWriter.println("second thing");
// ... several things
printWriter.println("last thing");
printWriter.flush();
printWriter.close();
return stringWriter.toString();
}
Editar Parece que no hay ninguna razón concreta para preferir uno sobre el otro, por lo que he aceptado la respuesta que mejor se ajusta a mi comprensión, y + 1ed todos los demás ans wers. Además, publiqué una respuesta por mi cuenta, dando los resultados de la evaluación comparativa que realicé, en respuesta a una de las respuestas. Gracias a todos.
Editar nuevo Resulta que no es una razón concreta para preferir uno (específicamente el StringBuilder) sobre el otro. Lo que me perdí la primera vez fue la adición de la nueva línea. Cuando agregas una nueva línea (como la anterior, como un apéndice separado), es un poco más rápida, no enormemente, pero junto con la claridad de intención, definitivamente es mejor. Ver mi respuesta a continuación para los tiempos mejorados.
No debe usar 'constructor.agregar ("lo primero" + nueva línea) '. El problema es que hay una asignación de Cadena adicional que no es necesaria (primero crea "lo primero \ n" y luego copia los datos de cadena al constructor). En cambio, hágalo así: 'builder.append (" first thing "). Append (newline)'. Esto copia directamente '" first first "' al constructor y luego 'newline'. Por supuesto, StringBuilder solo debe usarse si el número de cosas no es constante (por ejemplo, está en un bucle), javac ya optimiza '" a "+" b "+" c "' en 'new StringBuilder(). Append (" a "). anexar (" b "). anexar (" c "). toString()'. – robinst
@robinst Disculpas por la respuesta muy lenta. Acabo de volver a visitar esta pregunta y noté tu comentario. Excelente punto, y he rehecho mi prueba. Ver ediciones. – CPerkins
'Throwable.printStackTrace()' requiere un escritor. – ceving