So hängen Sie eine neue Zeile an StringBuilder an


234

Ich habe ein StringBuilderObjekt,

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

Jetzt möchte ich ein Zeilenumbruchzeichen an das anhängen StringBuilder . Wie kann ich es tun?

result.append("/n"); 

Funktioniert nicht. Also habe ich darüber nachgedacht, eine neue Zeile mit Unicode zu schreiben. Wird das helfen? Wenn ja, wie kann ich eine hinzufügen?


23
Ich dachte es ist "\n"oder System.getProperty("line.separator").
Alvin Wong

Eine neue Zeile ist nicht unbedingt ein LINE FEED (LF) -Zeichen (Ascii / Unicode 10). Wie die richtige Antwort zeigt, können Sie in Java entweder eine (LINE FEED oder eine plattformspezifische Newline) erhalten.
Basil Bourque

Antworten:


510

Es sollte sein

r.append("\n");

Aber ich empfehle Ihnen, wie unten zu tun,

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

System.getProperty("line.separator")gibt Ihnen systemabhängige Zeilenumbrüche in Java. Auch von Java 7 gibt es eine Methode, die den Wert direkt zurückgibt:System.lineSeparator()


87
+1 für die Verknüpfung System.lineSeparator. Die größere Frage ist, warum es keine StringBuilder#appendLine()Methode gibt.
Patrick M

14
System.lineSeparator()In der Dokumentation wird "Gibt die systemabhängige Zeilentrennzeichenfolge zurück." Dies ist nicht plattformunabhängig. Verwenden Sie diesen Code, wenn Sie eine Zeichenfolge schreiben müssen, die vom zugrunde liegenden Betriebssystem verwendet wird, andernfalls verwenden Sie '\n'.
toskland

2
@tuscland - Warum nicht einfach die ganze Zeit System.lineSeparator () verwenden? Warum ist '\ n' standardmäßig eine bessere Option?
RyanfaeScotland

16
Nein, System.lineSeparator()sollte verwendet werden, wenn Sie mit nicht portablen Ressourcen arbeiten (dh Ressourcen, die für das zugrunde liegende Betriebssystem spezifisch sind). Es hat einen anderen Wert, ob Sie Java unter Windows (\ r \ n) oder Unix (\ n) ausführen. Wenn Sie die System.lineSeparator()ganze Zeit verwenden, werden Sie daher nicht tragbare Dateien erstellen.
toskland

6
Unglaublich, es gibt noch keine appendLineÜberlastung StringBuilder.
Josh M.

22

Eine weitere Option ist die Verwendung von Apache Commons StrBuilder, dessen Funktionalität in StringBuilder fehlt.

StrBuilder.appendLn ()

Ab Version 3.6 ist StrBuilder zugunsten von TextStringBuilder mit der gleichen Funktionalität veraltet


5
... und seit Java 8 gibt es StringJoiner , der " verwendet wird, um eine Folge von Zeichen zu erstellen , die durch ein Trennzeichen getrennt sind und optional mit einem angegebenen Präfix beginnen und mit einem angegebenen Suffix enden. " Die Verwendung von "\ n" als Trennzeichen würde zu einem neuen führen Zeilen (außer der letzten). Intern wird ein StringBuilder verwendet. Ich nehme an, dass der gleiche Ansatz mit dem Google Guava Joiner realisiert werden könnte.
Jechterhoff

1
... und jetzt ist es so deprecated. Bitte benutzen org.apache.commons.text.TextStringBuilder.
Ashok MA

16

Flucht sollte getan werden \, nicht /.

Also r.append('\n');oder r.append("\n");wird funktionieren ( StringBuilderhat Methoden für charund StringTyp überladen ).



2

Ich erstelle eine ursprüngliche Klasse, die StringBuidler ähnelt, und kann die Zeile durch Aufrufen der Methode appendLine (String str) anhängen.

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

Verwendung:

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

Konsole:

aaaaa
bbbbb

1

Sie können auch das Zeilentrennzeichen in String.format(Siehejava.util.Formatter ) verwenden, das ebenfalls plattformunabhängig ist.

dh:

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

Wenn Sie weitere Zeilenabstände hinzufügen müssen, verwenden Sie einfach:

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

Sie können auch StringFormatIhre gesamte Zeichenfolge mit einem oder mehreren Zeilenumbrüchen am Ende formatieren.

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

0

Für Kotlin

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

Obwohl dies eine Java-Frage ist, ist dies auch das erste Google-Ergebnis für Kotlin, das sich als nützlich erweisen könnte.


Die Frage ist unter "Java" markiert. Sie müssen keine Lösung veröffentlichen, die nicht einmal für die mit der Frage verbundene Sprache geeignet ist.
Chntgomez

@chntgomez Ich suchte nach einer Möglichkeit, eine neue Zeile an StringBuilder in Kotlin anzuhängen und fand diese :-)
Alexander Poleschuk

0

Zusätzlich zur Antwort von KS, eine StringBuilderPlus-Klasse zu erstellen und das Adaptermuster zum Erweitern einer endgültigen Klasse zu verwenden, können Sie, wenn Sie Generika verwenden und das StringBuilderPlus-Objekt in den neuen Methoden append und appendLine zurückgeben, die vielen Append-Methoden von StringBuilders verwenden für alle verschiedenen Typen, während die Fähigkeit wiedererlangt wird, mehrere Anhängebefehle miteinander zu verbinden, wie unten gezeigt

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;
    }
}

Sie können dies dann genau wie die ursprüngliche StringBuilder-Klasse verwenden:

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

stringBuilder.toString();

-2

Verwenden Sie dies für Android zum Lesen und Schreiben!

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
Dies ist nicht einmal eine Antwort auf die Frage
chntgomez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.