วิธีผนวกบรรทัดใหม่ให้กับ StringBuilder


234

ฉันมีStringBuilderวัตถุ

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

ตอนนี้ผมต้องการที่จะผนวกอักขระ newline StringBuilderไป ฉันจะทำมันได้อย่างไร

result.append("/n"); 

ไม่ทำงาน, ไม่เป็นผล. ดังนั้นฉันจึงคิดที่จะเขียนบรรทัดใหม่โดยใช้ Unicode จะช่วยได้ไหม ถ้าเป็นเช่นนั้นฉันจะเพิ่มได้อย่างไร


23
ฉันคิดว่ามันเป็นหรือ"\n" System.getProperty("line.separator")
Alvin Wong

การขึ้นบรรทัดใหม่ไม่จำเป็นต้องเป็นอักขระ LINE FEED (LF) (Ascii / Unicode 10) ตามคำตอบที่ถูกต้องใน Java คุณสามารถรับได้ (LINE FEED หรือขึ้นบรรทัดใหม่เฉพาะแพลตฟอร์ม)
Basil Bourque

คำตอบ:


510

มันควรจะเป็น

r.append("\n");

แต่ฉันขอแนะนำให้คุณทำดังต่อไปนี้

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

System.getProperty("line.separator")ช่วยให้คุณขึ้นบรรทัดใหม่ขึ้นอยู่กับระบบในจาวา จาก Java 7 ยังมีวิธีการคืนค่าโดยตรง:System.lineSeparator()


87
+1 สำหรับทางลัด System.lineSeparator คำถามที่ใหญ่กว่าคือสาเหตุที่ไม่มีStringBuilder#appendLine()วิธีการ
Patrick M

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แล้ว
Josh M.

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กรุณาใช้
Ashok MA

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

สำหรับ Kotlin

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

แม้ว่านี่จะเป็นคำถามจาวา แต่นี่ก็เป็นผลการค้นหา google ครั้งแรกสำหรับ kotlin ซึ่งอาจมีประโยชน์


คำถามถูกติดแท็กภายใต้ "java" ไม่จำเป็นต้องโพสต์โซลูชันที่ไม่ได้มีไว้สำหรับภาษาที่เกี่ยวข้องกับคำถาม
chntgomez

@chntgomez ฉันมองหาวิธีที่จะผนวกบรรทัดใหม่ให้กับ StringBuilder ใน Kotlin และพบสิ่งนี้ :-)
Alexander Poleschuk

0

นอกเหนือจากการตอบสนองของ KS ในการสร้างคลาส StringBuilderPlus และใช้รูปแบบอะแดปเตอร์เพื่อขยายคลาสสุดท้ายหากคุณใช้ generics และส่งคืนออบเจ็กต์ StringBuilderPlus ในวิธีการผนวกและผนวกใหม่คุณสามารถใช้ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.