Cómo agregar una nueva línea a StringBuilder


234

Tengo un StringBuilderobjeto

StringBuilder result = new StringBuilder();
result.append(someChar);

Ahora quiero agregar un carácter de nueva línea al StringBuilder. ¿Cómo puedo hacerlo?

result.append("/n"); 

No funciona. Entonces, estaba pensando en escribir una nueva línea usando Unicode. ¿Esto ayudará? Si es así, ¿cómo puedo agregar uno?



Una nueva línea no es necesariamente un carácter de ALIMENTACIÓN DE LÍNEA (LF) (Ascii / Unicode 10). Como señala la respuesta correcta , en Java puede obtener uno (ALIMENTACIÓN DE LÍNEA o una nueva línea específica de la plataforma).
Basil Bourque

Respuestas:


510

Debería ser

r.append("\n");

Pero te recomiendo que hagas lo siguiente,

r.append(System.getProperty("line.separator"));

System.getProperty("line.separator")le ofrece una nueva línea dependiente del sistema en java. También de Java 7 hay un método que devuelve el valor directamente:System.lineSeparator()


87
+1 para el acceso directo System.lineSeparator. La pregunta más importante es por qué no hay un StringBuilder#appendLine()método.
Patrick M

14
System.lineSeparator()la documentación menciona "Devuelve la cadena del separador de línea dependiente del sistema". Esto no es independiente de la plataforma. Use este código si necesita escribir una cadena que será utilizada por el sistema operativo subyacente; de ​​lo contrario, use '\n'.
Tuscland

2
@tuscland - ¿Por qué no usar System.lineSeparator () todo el tiempo? ¿Por qué es '\ n' una mejor opción por defecto?
RyanfaeScotland

16
No, System.lineSeparator()debe usarse cuando maneja recursos no portátiles (es decir, recursos específicos del sistema operativo subyacente). Tiene un valor diferente si está ejecutando Java en Windows (\ r \ n) o Unix (\ n). Si usa System.lineSeparator()todo el tiempo, por lo tanto, producirá archivos no portátiles.
Tuscland

66
Increíble aún no hay una appendLinesobrecarga StringBuilder.
Josh M.

22

Otra opción es usar Apache Commons StrBuilder, que tiene la funcionalidad que falta en StringBuilder.

StrBuilder.appendLn ()

A partir de la versión 3.6, StrBuilder ha quedado en desuso a favor de TextStringBuilder, que tiene la misma funcionalidad


55
... y desde Java 8 está StringJoiner , que " se usa para construir una secuencia de caracteres separados por un delimitador y opcionalmente comenzando con un prefijo proporcionado y terminando con un sufijo proporcionado. " Usar "\ n" como delimitador daría como resultado un nuevo líneas (excepto la última). Internamente, utiliza un StringBuilder. Supongo que se podría realizar el mismo enfoque con Google Guava Joiner.
jechterhoff

1
... y ahora esto es deprecated. Por favor use org.apache.commons.text.TextStringBuilder.
Ashok MA

16

El escape debe hacerse con \, no /.

Así r.append('\n');o r.append("\n");funcionará ( StringBuilderha sobrecargado los métodos chary el Stringtipo).



2

Creo una clase original que es similar a StringBuidler y puedo agregar línea llamando al método appendLine (String str).

public class StringBuilderPlus {

    private StringBuilder sb;

    public StringBuilderPlus(){
         sb = new StringBuilder();
    }

    public void append(String str)
    {
        sb.append(str != null ? str : "");
    }

    public void appendLine(String str)
    {
        sb.append(str != null ? str : "").append(System.getProperty("line.separator"));
    }

    public String toString()
    {
        return sb.toString();
    }
}

Uso:

StringBuilderPlus sb = new StringBuilderPlus();
sb.appendLine("aaaaa");
sb.appendLine("bbbbb");
System.out.println(sb.toString());

Consola:

aaaaa
bbbbb

1

También puede usar el carácter separador de línea en String.format(Ver java.util.Formatter), que también es independiente de la plataforma.

es decir:

result.append(String.format("%n", ""));

Si necesita agregar más espacios de línea, simplemente use:

result.append(String.format("%n%n", ""));

También puede usar StringFormatpara formatear toda su cadena, con una (s) nueva (s) línea (s) al final.

result.append(String.format("%10s%n%n", "This is my string."));

0

Para Kotlin

StringBuilder().appendln("your text");

Aunque esta es una pregunta de Java, este también es el primer resultado de Google para Kotlin, podría ser útil.


La pregunta está etiquetada bajo "java". No es necesario publicar una solución que ni siquiera sea para el idioma relacionado con la pregunta.
chntgomez

@chntgomez Busqué una manera de agregar una nueva línea a StringBuilder en Kotlin y encontré esto :-)
Alexander Poleschuk

0

Además de la respuesta de KS de crear una clase StringBuilderPlus y utilizar el patrón del adaptador para extender una clase final, si utiliza genéricos y devuelve el objeto StringBuilderPlus en los nuevos métodos append y appendLine, puede hacer uso de los métodos StringBuilders de muchos métodos. para todos los tipos diferentes, al tiempo que recupera la capacidad de encadenar múltiples comandos de agregación, como se muestra a continuación

public class StringBuilderPlus {

    private final StringBuilder stringBuilder;

    public StringBuilderPlus() {
        this.stringBuilder = new StringBuilder();
    }

    public <T> StringBuilderPlus append(T t) {
        stringBuilder.append(t);
        return this;
    }

    public <T> StringBuilderPlus appendLine(T t) {
        stringBuilder.append(t).append(System.lineSeparator());
        return this;
    }

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

    public StringBuilder getStringBuilder() {
        return stringBuilder;
    }
}

luego puede usar esto exactamente como la clase StringBuilder original:

StringBuilderPlus stringBuilder = new StringBuilderPlus();
stringBuilder.appendLine("test")
    .appendLine('c')
    .appendLine(1)
    .appendLine(1.2)
    .appendLine(1L);

stringBuilder.toString();

-2

¡Para Android , use esto para leer y escribir!

private void writeToFile(String message) {
        try {
            OutputStream outputStream = openFileOutput("todoList.txt",Context.MODE_PRIVATE);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            outputStreamWriter.write(message);
            outputStreamWriter.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String readFromFile() throws IOException {

        String result = "";
        InputStream inputStream = openFileInput("todoList.txt");

        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String tempString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (tempString = bufferedReader.readLine()) != null ) {

                stringBuilder.append(tempString);
                stringBuilder.append("\n");
            }
            inputStream.close();
            result = stringBuilder.toString();
        }
        return result;
    }

1
Esta ni siquiera es una respuesta a la pregunta
chntgomez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.