Cách nối thêm một dòng mới vào StringBuilder


234

Tôi có một StringBuilderđối tượng,

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

Bây giờ tôi muốn thêm một ký tự dòng mới vào StringBuilder. Tôi làm nó như thế nào?

result.append("/n"); 

Không hoạt động. Vì vậy, tôi đã suy nghĩ về việc viết một dòng mới bằng cách sử dụng Unicode. Điều này sẽ giúp? Nếu vậy, làm thế nào tôi có thể thêm một?


23
Tôi nghĩ rằng nó là "\n", hoặc System.getProperty("line.separator").
Alvin Wong

Một dòng mới không nhất thiết phải là tự LINE FEED (LF) (Ascii / Unicode 10). Như câu trả lời chính xác chỉ ra, trong Java, bạn có thể nhận được một (LINE FEED hoặc một dòng mới dành riêng cho nền tảng).
Basil Bourque

Câu trả lời:


510

Nó nên

r.append("\n");

Nhưng tôi khuyên bạn nên làm như dưới đây,

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

System.getProperty("line.separator")cung cấp cho bạn dòng mới phụ thuộc hệ thống trong java. Cũng từ Java 7, có một phương thức trả về giá trị trực tiếp:System.lineSeparator()


87
+1 cho phím tắt System.lineSpayator. Câu hỏi lớn hơn là tại sao không có một StringBuilder#appendLine()phương pháp.
Patrick M

14
System.lineSeparator()tài liệu đề cập "Trả về chuỗi phân tách dòng phụ thuộc hệ thống.". Đây không phải là nền tảng độc lập. Sử dụng mã này nếu bạn cần viết một chuỗi sẽ được sử dụng bởi hệ điều hành bên dưới, nếu không thì sử dụng '\n'.
tuscland

2
@tuscland - Tại sao không sử dụng System.lineSpayator () mọi lúc? Tại sao '\ n' là một tùy chọn tốt hơn làm mặc định?
RyanfaeScotland

16
Không, System.lineSeparator()nên được sử dụng khi bạn xử lý các tài nguyên không di động (nghĩa là các tài nguyên dành riêng cho hệ điều hành cơ bản). Nó có một giá trị khác khi bạn đang chạy Java trên Windows (\ r \ n) hoặc Unix (\ n). Nếu bạn sử dụng System.lineSeparator()tất cả thời gian, do đó bạn sẽ tạo ra các tệp không di động.
tuscland

6
Không thể tin được là đã không appendLinequá tải StringBuilder.
Josh M.

22

Một tùy chọn khác là sử dụng Apache Commons StrBuilder, có chức năng thiếu trong StringBuilder.

StrBuilder.appendLn ()

Kể từ phiên bản 3.6, StrBuilder đã không được hỗ trợ cho TextStringBuilder có cùng chức năng


5
... và vì Java 8 có StringJoiner , " được sử dụng để xây dựng một chuỗi các ký tự được phân tách bằng dấu phân cách và tùy ý bắt đầu bằng một tiền tố được cung cấp và kết thúc bằng hậu tố được cung cấp. " Sử dụng "\ n" làm dấu phân cách sẽ dẫn đến mới dòng (ngoại trừ dòng cuối cùng). Trong nội bộ, nó sử dụng StringBuilder. Cách tiếp cận tương tự có thể được nhận ra bằng cách sử dụng Google Guava Joiner, tôi giả sử.
jechterhoff

1
... Và bây giờ đây là deprecated. Hãy sử dụng org.apache.commons.text.TextStringBuilder.
Ashok MA

16

Thoát nên được thực hiện với \, không /.

Vì vậy, r.append('\n');hoặc r.append("\n");sẽ làm việc ( StringBuildercó phương thức quá tải cho charStringloại).



2

Tôi tạo lớp gốc tương tự StringBuidler và có thể nối thêm dòng bằng cách gọi phương thức 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();
    }
}

Sử dụng:

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

Bảng điều khiển:

aaaaa
bbbbb

1

Bạn cũng có thể sử dụng ký tự phân cách dòng trong String.format(Xem java.util.Formatter), cũng là bất khả tri của nền tảng.

I E:

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

Nếu bạn cần thêm nhiều không gian dòng, chỉ cần sử dụng:

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

Bạn cũng có thể sử dụng StringFormatđể định dạng toàn bộ chuỗi của mình, với một dòng mới ở cuối.

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

0

Đối với Kotlin,

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

Mặc dù đây là một câu hỏi java, đây cũng là kết quả google đầu tiên cho kotlin, có thể có ích.


Câu hỏi được gắn thẻ trong "java". Không cần phải đăng một giải pháp thậm chí không dành cho ngôn ngữ liên quan đến câu hỏi.
chntgomez

@chntgomez Tôi đã tìm cách nối thêm một dòng mới vào StringBuilder ở Kotlin và tìm thấy cái này :-)
Alexander Poleschuk

0

Ngoài phản ứng của KS về việc tạo lớp StringBuilderPlus và sử dụng mẫu bộ điều hợp có để mở rộng lớp cuối cùng, nếu bạn sử dụng chung và trả về đối tượng StringBuilderPlus trong các phương thức nối thêm và nối thêm mới, bạn có thể sử dụng nhiều phương thức nối thêm StringBuilders cho tất cả các loại khác nhau, trong khi lấy lại khả năng xâu chuỗi nhiều lệnh nối lại với nhau, như hiển thị bên dưới

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

sau đó bạn có thể sử dụng chính xác như lớp StringBuilder ban đầu:

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

stringBuilder.toString();

-2

Đối với Android , hãy sử dụng tính năng này để đọc và viết!

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
Đây thậm chí không phải là một câu trả lời cho câu hỏi
chntgomez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.