Jak dołączyć nowy wiersz do StringBuilder


234

Mam StringBuilderprzedmiot

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

Teraz chcę dodać znak nowej linii do StringBuilder. Jak mogę to zrobić?

result.append("/n"); 

Nie działa. Tak więc myślałem o napisaniu nowej linii za pomocą Unicode. Czy to pomoże? Jeśli tak, jak mogę go dodać?


23
Myślałem, że to jest "\n", albo System.getProperty("line.separator").
Alvin Wong,

Nowa linia niekoniecznie jest znakiem LINE FEED (LF) (Ascii / Unicode 10). Jak wskazuje poprawna odpowiedź , w Javie można uzyskać jeden (LINE FEED lub specyficzny dla platformy nowy wiersz).
Basil Bourque,

Odpowiedzi:


510

Powinno być

r.append("\n");

Ale polecam zrobić tak, jak poniżej,

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

System.getProperty("line.separator")daje zależną od systemu nową linię w Javie. Również z Java 7 istnieje metoda, która zwraca wartość bezpośrednio:System.lineSeparator()


87
+1 dla skrótu System.lineSeparator. Większe pytanie dotyczy tego, dlaczego nie ma StringBuilder#appendLine()metody.
Patrick M,

14
System.lineSeparator()w dokumentacji wspomniano „Zwraca zależny od systemu ciąg separatora linii.”. To nie jest niezależne od platformy. Użyj tego kodu, jeśli chcesz napisać ciąg, który będzie używany przez podstawowy system operacyjny, w przeciwnym razie użyj '\n'.
tuscland

2
@tuscland - Dlaczego po prostu nie używasz System.lineSeparator () przez cały czas? Dlaczego „\ n” jest lepszą opcją domyślną?
RyanfaeScotland

16
Nie, System.lineSeparator()należy używać, gdy masz do czynienia z zasobami nieprzenośnymi (to znaczy zasobami specyficznymi dla bazowego systemu operacyjnego). Ma inną wartość, niezależnie od tego, czy używasz Javy w systemie Windows (\ r \ n) lub Unix (\ n). Jeśli używasz System.lineSeparator()cały czas, będziesz produkować pliki nieprzenośne.
tuscland

6
Niewiarygodne, że nie ma już appendLineprzeciążenia StringBuilder.
Josh M.

22

Inną opcją jest użycie Apache Commons StrBuilder, który ma funkcjonalność, której brakuje w StringBuilder.

StrBuilder.appendLn ()

Od wersji 3.6 StrBuilder został wycofany na korzyść TextStringBuilder, który ma tę samą funkcjonalność


5
... a od Java 8 istnieje StringJoiner , który „ służy do konstruowania sekwencji znaków oddzielonych separatorem i opcjonalnie rozpoczynający się od dostarczonego prefiksu, a kończący na dostarczonym sufiksie. ” Użycie „\ n” jako separatora spowodowałoby nowe wiersze (z wyjątkiem ostatniego). Wewnętrznie używa StringBuilder. Zakładam, że to samo podejście można zrealizować za pomocą Google Guava Joiner.
jechterhoff

1
... a teraz to jest deprecated. Proszę używać org.apache.commons.text.TextStringBuilder.
Ashok MA

16

Ucieczka powinna być zrobiona \, nie /.

Tak r.append('\n');lub r.append("\n");będzie działać ( StringBuilderprzeciążono metody chari Stringwpisz).



2

Tworzę oryginalną klasę podobną do StringBuidler i mogę dołączyć linię, wywołując metodę 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();
    }
}

Stosowanie:

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

Konsola:

aaaaa
bbbbb

1

Możesz także użyć znaku separatora linii w String.format(Zobacz java.util.Formatter), który jest również niezależny od platformy.

to znaczy:

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

Jeśli chcesz dodać więcej spacji, użyj:

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

Możesz także użyć StringFormatdo sformatowania całego łańcucha, z nowymi liniami na końcu.

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

0

Dla Kotlina

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

Chociaż jest to pytanie Java, jest to również pierwszy wynik Google dla kotlin, może się przydać.


Pytanie jest oznaczone jako „java”. Nie ma potrzeby publikowania rozwiązania, które nie dotyczy nawet języka związanego z pytaniem.
chntgomez

@chntgomez Szukałem sposobu na dodanie nowej linii do StringBuilder w Kotlin i znalazłem to :-)
Alexander Poleschuk

0

Oprócz odpowiedzi KS na utworzenie klasy StringBuilderPlus i wykorzystanie wzorca adaptera do rozszerzenia klasy końcowej, jeśli użyjesz ogólnych i zwrócisz obiekt StringBuilderPlus w nowych metodach append i appendLine, możesz skorzystać z StringBuilders wielu metod dołączania dla wszystkich różnych typów, przy jednoczesnym odzyskaniu możliwości ciągnięcia wielu poleceń dołączania razem, jak pokazano poniżej

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

możesz następnie użyć tego dokładnie jak oryginalnej klasy StringBuilder:

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

stringBuilder.toString();

-2

W systemie Android użyj tego do odczytu i zapisu!

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
To nie jest nawet odpowiedź na pytanie
chntgomez
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.