Як додати нову рядок до 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'.
tuscland

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, може стати в нагоді.


Питання позначено тегом "java". Не потрібно розміщувати рішення, яке навіть не стосується мови, пов'язаної з питанням.
chntgomez

@chntgomez Я шукав спосіб додати нову лінію до StringBuilder у Котліні і знайшов це :-)
Олександр Полещук

0

На додаток до відповіді KS про створення класу StringBuilderPlus та використання шаблону адаптера для розширення остаточного класу, якщо ви використовуєте дженерики та повертаєте об'єкт StringBuilderPlus у нових методах додавання та 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
Це навіть не відповідь на запитання
chntgomez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.