Как добавить новую строку в StringBuilder


234

У меня есть StringBuilderобъект,

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

Теперь я хочу добавить символ новой строки в StringBuilder. Как мне это сделать?

result.append("/n"); 

Не работает. Итак, я думал о написании новой строки с использованием Unicode. Это поможет? Если так, как я могу добавить один?


23
Я думал, что это "\n"или System.getProperty("line.separator").
Элвин Вонг

Новая строка не обязательно является символом LINE FEED (LF) (Ascii / Unicode 10). Как указывает правильный ответ , в Java вы можете получить либо один (LINE FEED, либо перевод строки для конкретной платформы).
Базилик Бурк

Ответы:


510

Так должно быть

r.append("\n");

Но я рекомендую вам сделать, как показано ниже,

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

System.getProperty("line.separator")дает вам системно-зависимый перевод строки в Java. Также из Java 7 есть метод, который возвращает значение напрямую:System.lineSeparator()


87
+1 для ярлыка System.lineSeparator. Большой вопрос, почему нет StringBuilder#appendLine()метода.
Патрик М

14
System.lineSeparator()В документации упоминается "Возвращает системно-зависимую строку разделителя строк." Это не зависит от платформы. Используйте этот код, если вам нужно написать строку, которая будет использоваться базовой операционной системой, в противном случае используйте '\n'.
Тоскана

2
@tuscland - Почему бы просто не использовать System.lineSeparator () все время? Почему '\ n' лучше по умолчанию?
RyanfaeScotland

16
Нет, System.lineSeparator()следует использовать, когда вы имеете дело с непереносимыми ресурсами (то есть ресурсами, специфичными для базовой операционной системы). Он имеет другое значение, если вы используете Java в Windows (\ r \ n) или Unix (\ n). Если вы используете System.lineSeparator()все время, вы будете создавать непереносимые файлы.
tuscland

6
Невероятно, но appendLineперегрузки уже нет StringBuilder.
Джош М.

22

Другим вариантом является использование Apache Commons StrBuilder, функциональность которого отсутствует в StringBuilder.

StrBuilder.appendLn ()

Начиная с версии 3.6 StrBuilder устарел в пользу TextStringBuilder, который имеет те же функции


5
... и, начиная с Java 8, есть StringJoiner , который " используется для создания последовательности символов, разделенных разделителем и, необязательно, начинающихся с предоставленного префикса и заканчивающихся предоставленным суффиксом. Использование" \ n "в качестве разделителя приведет к новому линии (кроме последней). Внутренне он использует StringBuilder. Я полагаю, такой же подход может быть реализован с помощью Google Guava Joiner.
jechterhoff

1
... а теперь это так deprecated. Пожалуйста, используйте org.apache.commons.text.TextStringBuilder.
Ашок М.А.

16

Побег должен быть сделан \, а не /.

Так r.append('\n');или r.append("\n");будет работать ( StringBuilderперегружены методы для charи Stringтипа).



2

Я создаю оригинальный класс, который похож на StringBuidler и может добавить строку, вызвав метод 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();
    }
}

Использование:

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

Приставка:

aaaaa
bbbbb

1

Вы также можете использовать символ разделителя строк в String.format(См. java.util.Formatter), Который также не зависит от платформы.

то есть:

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

Если вам нужно добавить больше пробелов, просто используйте:

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

Вы также можете использовать StringFormatдля форматирования всей вашей строки, с новой строкой (ами) в конце.

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

0

Для Котлина

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

Хотя это вопрос Java, это также первый результат Google для kotlin, может пригодиться.


Вопрос помечен под "Ява". Не нужно размещать решение, которое даже не для языка, связанного с вопросом.
Чнтгомез

@chntgomez Я искал способ добавить новую
Александр Полещук

0

В дополнение к ответу KS на создание класса StringBuilderPlus и использование шаблона адаптера для расширения конечного класса, если вы используете обобщенные значения и возвращаете объект StringBuilderPlus в новых методах append и appendLine, вы можете использовать многие методы добавления StringBuilders. для всех различных типов, при этом восстанавливая способность объединять несколько команд добавления в строку, как показано ниже

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

затем вы можете использовать это точно так же, как исходный класс StringBuilder:

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

stringBuilder.toString();

-2

Для Android используйте это для чтения и записи!

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
Это даже не ответ на вопрос
чнтгомез
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.