2010-03-24 12 views
10

Así que básicamente tienen que hacer esto:¿Hay una manera fácil de concatenar varias líneas de texto en una cadena sin agregar constantemente una nueva línea?

String text = "line1\n"; 
text += "line2\n"; 
text += "line3\n"; 
useString(text); 

No es más complicado, pero esa es la idea básica. ¿Hay algo por ahí que me permita hacer algo más en la línea de esto sin embargo?

DesiredStringThinger text = new DesiredStringThinger(); 
text.append("line1"); 
text.append("line2"); 
text.append("line3"); 
useString(text.toString()); 

Obviamente, no es necesario que funcione exactamente así, pero creo que entiendo el punto básico. Siempre existe la opción de escribir un bucle que procesa el texto yo mismo, pero sería bueno si hay una clase Java estándar que ya hace algo como esto en lugar de que yo necesite llevar una clase entre aplicaciones solo para poder hacer algo tan trivial.

Gracias!

Respuesta

15

Se puede utilizar un StringWriter envuelto en una PrintWriter:

StringWriter stringWriter = new StringWriter(); 
PrintWriter writer = new PrintWriter(stringWriter, true); 
writer.println("line1"); 
writer.println("line2"); 
writer.println("line3"); 
useString(stringWriter.toString()); 
+1

+1, no sabía nada de 'StringWriter' – missingfaktor

+0

Gracias, me ayudó ... –

9

AFAIK no hay clase de biblioteca que le permita hacerlo.

A continuación se hace el trabajo sin embargo:

class DesiredStringThinger { 
    StringBuilder text = new StringBuilder(); 

    public void append(String s) { text.append(s).append("\n"); } 

    @Override 
    public String toString() { return text.toString(); } 
} 
+0

Si bien es correcto, esto causará problemas de rendimiento con un número relativamente pequeño de líneas: la solución de Roman es en ese sentido mucho mejor. –

+0

Solo una recomendación: use @ Roman's 'String lsp = System.getProperty ("line.separator");' pero lo declara como un miembro estático privado – Yaneeve

+2

@Tomislav: ¿Cómo? – missingfaktor

5
public String createString() { 
    StringBuilder sb = new StringBuilder(); 
    String txt = appendLine("firstline", sb).appendLine("2ndLine", sb).toString(); 
} 

private StringBuilder appendLine (String line, StringBuilder sb) { 
    String lsp = System.getProperty("line.separator"); 
    return sb.append (line).append (lsp); 
} 
2

Puede utilizar un StringBuffer

StringBuffer text = new StringBuffer(); 
text.append("line1"); 
text.append("line2"); 
... 
useString(text.toString()); 

Esto no va a añadir el carácter de nueva línea, pero que sin duda puede añadir que a su vez para cada línea

+1

Creo que Marshmellow1328 quiere una nueva línea entre cada token cuando se llama append() –

+0

Esto es en realidad donde comencé. Luego me cansé de agregar el carácter de nueva línea para cada línea. Mientras que podría haber creado fácilmente una pequeña función auxiliar para hacerlo, esperaba que pudiera haber algo que ya existe en lugar de tener que expandir mi biblioteca básica de Java. – Marshmellow1328

1

Quizás el método más bajo impacto es añadir un método estático para añadir una nueva línea a un StringBuilder.

public static StringBuilder appendln(StringBuilder buff, String str) { 
    return buff.append(str).append('\n'); 
} 

Pero @Joachim Sauer me gusta a mi solución preferida. Para ejemplos más complejos, es posible que desee utilizar su propio decorador Writer, como @Rahul G (solo use campos privados).

1

Si no está loco por el rendimiento, creo que esto es limpio y ordenado.

class DesiredStringThinger { 
    StringBuilder sb = new StringBuilder(); 

    public void concat(String... s) { 
     for(String str : s){ 
     sb.append(s).append("\n"); 
     } 
    } 

    @Override 
    public String toString() { 
     return sb.toString(); 
    } 
} 
3

Puede utilizar desde Apache Commons el ayudante StringUtils.join. Que permite construir una cadena a partir de una lista. Puede agregar el carácter/cadena 'delimitador'.

2

Si está dispuesto a utilizar bibliotecas externas, consulte el Joiner en Guava.

Su código iría a algo así como

String result = Joiner.on("\n").join(parts); 

donde parts es un Iterable<String>.

Cuestiones relacionadas