สตริง Java multiline


516

มาจาก Perl ฉันแน่ใจว่าขาด "here-document" หมายถึงการสร้างสตริงหลายบรรทัดในซอร์สโค้ด:

$string = <<"EOF"  # create a three-line string
text
text
text
EOF

ใน Java ฉันต้องมีเครื่องหมายคำพูดที่ยุ่งยากและเครื่องหมายบวกในทุกบรรทัดเมื่อฉันเชื่อมสตริงหลายบรรทัดของฉันตั้งแต่เริ่มต้น

อะไรคือทางเลือกที่ดีกว่า กำหนดสตริงของฉันในไฟล์คุณสมบัติหรือไม่

แก้ไข : สองคำตอบบอกว่า StringBuilder.append () เป็นที่นิยมในเครื่องหมายบวก มีใครอธิบายเพิ่มเติมว่าทำไมพวกเขาถึงคิดเช่นนั้น? มันไม่ได้ดูดีกว่าสำหรับฉันเลย ฉันกำลังมองหาวิธีการเกี่ยวกับความจริงที่ว่าสตริงหลายบรรทัดไม่ใช่โครงสร้างภาษาชั้นหนึ่งซึ่งหมายความว่าฉันไม่ต้องการแทนที่โครงสร้างภาษาชั้นหนึ่ง (การต่อสตริงด้วยเครื่องหมายบวก) ด้วยการเรียกเมธอด

แก้ไข : เพื่อชี้แจงคำถามของฉันเพิ่มเติมฉันไม่ได้กังวลเกี่ยวกับประสิทธิภาพเลย ฉันกังวลเกี่ยวกับการบำรุงรักษาและปัญหาการออกแบบ


12
StringBuilder.append () เป็นที่นิยมที่จะบวกเมื่อเพิ่มลงในสตริงซ้ำ ๆ เพราะทุกครั้งที่คุณทำstring1 + string2คุณกำลังจัดสรรวัตถุสตริงใหม่และคัดลอกอักขระจากสตริงอินพุตทั้งสอง หากคุณเพิ่ม n Strings เข้าด้วยกันคุณจะทำการจัดสรร n-1 และคัดลอกตัวอักษรโดยประมาณ (n ^ 2) / 2 StringBuilder ในทางกลับกันคัดลอกและจัดสรรซ้ำน้อยกว่า (แม้ว่าจะยังคงทำทั้งสองอย่างเมื่อคุณมีขนาดเกินกว่าบัฟเฟอร์ภายใน) ในทางทฤษฎีมีกรณีที่คอมไพเลอร์สามารถแปลง + เพื่อใช้ StringBuilder แต่ในทางปฏิบัติใครจะรู้
ลอเรน Gonsalves

5
ทุกครั้งที่ฉันกระโดดเข้าไปในดีบักเกอร์ + จะถูกแปลงเป็นสาย StringBuilder.append () บน Java 1.5 ฉันมีเพื่อนร่วมงานอย่างสับสนบอกฉันว่า StringBuilder มีข้อผิดพลาดเนื่องจากพวกเขาดีบักเป็นรหัสที่ดูเหมือนจะไม่เรียกมันและปิดท้าย
skiphoppy

4
ดูเพิ่มเติมได้ที่: stackoverflow.com/questions/782810/…
Michael Myers

61
โปรดสังเกตว่าสตริงตัวอักษรที่สร้างขึ้นจาก "abc \ n" + "def \ n" ฯลฯ ไม่ได้ใช้ StringBuilder: คอมไพเลอร์ติดกาวเข้าด้วยกันและวางลงในไฟล์. class เป็นตัวอักษรเดียวเช่นเดียวกับประเภทอื่น ๆ ของ พับอย่างต่อเนื่อง
araqnid

6
IDEs ส่วนใหญ่รองรับการป้อนสตริงหลายบรรทัด กล่าวคือ คุณเพียงพิมพ์หรือวางสิ่งที่คุณต้องการลงในสตริง "" และมันจะเพิ่ม \ n และ "+" ตามต้องการ เช่นฉันสามารถวางข้อความ 40 บรรทัดลงใน String และ teh IDE จะเรียงลำดับข้อความให้คุณ
Peter Lawrey

คำตอบ:


118

Stephen Colebourne ได้สร้างข้อเสนอสำหรับการเพิ่มสตริงหลายบรรทัดใน Java 7

นอกจากนี้ Groovy ยังรองรับสายอักขระหลายคู่สายอยู่แล้ว


14
กระบวนการ Project Coin สำหรับการปรับปรุงใน Java รวมถึงสตริงหลายบรรทัดmail.openjdk.java.net/pipermail/coin-dev/2009-F กุมภาพันธ์ / มันได้รับการปฏิเสธโดยออราเคิลblogs.sun.com/darcy/entry/project_coin_final_five
JodaStephen

8
การเปลี่ยนแปลงใด ๆ ในปี 2012?
Ilia G

13
น่าเสียดายที่นี่ไม่ได้ทำให้มันกลายเป็นข้อมูลจำเพาะ
namuol

3
ลิงก์ blogs.sun.com ใช้งานไม่ได้ แต่ฉันคิดว่าเนื้อหาอยู่ที่blogs.oracle.com/darcy/entry/project_coin_final_fiveตอนนี้
Donal Fellows

8
ดูเหมือนว่าในเดือนมกราคม 2018 ชุมชนกำลังพิจารณาสตริงที่มีหลายบรรทัดอีกครั้ง openjdk.java.net/jeps/326
Shane Gannon

485

ดูเหมือนว่าคุณต้องการทำตัวอักษรหลายบรรทัดซึ่งไม่มีอยู่ใน Java

ทางเลือกที่ดีที่สุดของคุณคือสตริงที่เป็นเพียงการ+รวมเข้าด้วยกัน ตัวเลือกอื่น ๆ บางคนได้กล่าวถึง (StringBuilder, String.format, String.join) จะดีกว่าถ้าคุณเริ่มต้นด้วยอาร์เรย์ของสตริง

พิจารณาสิ่งนี้:

String s = "It was the best of times, it was the worst of times,\n"
         + "it was the age of wisdom, it was the age of foolishness,\n"
         + "it was the epoch of belief, it was the epoch of incredulity,\n"
         + "it was the season of Light, it was the season of Darkness,\n"
         + "it was the spring of hope, it was the winter of despair,\n"
         + "we had everything before us, we had nothing before us";

กับStringBuilder:

String s = new StringBuilder()
           .append("It was the best of times, it was the worst of times,\n")
           .append("it was the age of wisdom, it was the age of foolishness,\n")
           .append("it was the epoch of belief, it was the epoch of incredulity,\n")
           .append("it was the season of Light, it was the season of Darkness,\n")
           .append("it was the spring of hope, it was the winter of despair,\n")
           .append("we had everything before us, we had nothing before us")
           .toString();

กับString.format():

String s = String.format("%s\n%s\n%s\n%s\n%s\n%s"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

กับ Java8 String.join():

String s = String.join("\n"
         , "It was the best of times, it was the worst of times,"
         , "it was the age of wisdom, it was the age of foolishness,"
         , "it was the epoch of belief, it was the epoch of incredulity,"
         , "it was the season of Light, it was the season of Darkness,"
         , "it was the spring of hope, it was the winter of despair,"
         , "we had everything before us, we had nothing before us"
);

หากคุณต้องการขึ้นบรรทัดใหม่สำหรับระบบของคุณโดยเฉพาะคุณอาจจำเป็นต้องใช้System.lineSeparator()หรือคุณสามารถใช้ใน%nString.format

อีกทางเลือกหนึ่งคือการใส่ทรัพยากรในไฟล์ข้อความและเพียงแค่อ่านเนื้อหาของไฟล์นั้น สิ่งนี้จะดีกว่าสำหรับสตริงที่มีขนาดใหญ่มากเพื่อหลีกเลี่ยงการ bloating ไฟล์คลาสของคุณโดยไม่จำเป็น


246
นอกจากนี้คอมไพเลอร์รุ่นแรกจะต่อกันโดยอัตโนมัติเนื่องจากคอมไพเลอร์ทั้งหมดรู้จักในเวลารวบรวม แม้ว่าจะไม่รู้จักสตริงในเวลารวบรวม แต่ก็ไม่ช้ากว่า StringBuilder หรือ String.format () เหตุผลเดียวที่จะหลีกเลี่ยงการต่อกับ + คือถ้าคุณทำมันด้วยการวนซ้ำ
Michael Myers

23
ปัญหาของString.formatรุ่นนี้คือคุณต้องคงรูปแบบให้สอดคล้องกับจำนวนบรรทัด
Bart van Heukelom

4
String.format ไม่มีประสิทธิภาพเมื่อเทียบกับอีกสองตัวอย่าง
cmcginty

10
คำตอบนี้เป็นวิธีแก้ปัญหาที่ไม่เหมาะสมกับคำถาม เรามีมาโคร SAS 2000 รายการหรือกลุ่มของแบบสอบถาม SQL 200 บรรทัดซึ่งเราต้องการคัดลอกและวาง ในการแนะนำให้เราใช้ + "" concat เพื่อแปลงข้อความหลายบรรทัดลงในการผนวก StringBuffer นั้นเป็นเรื่องน่าขัน
ความสุข Geek

21
@BlessedGeek: คำถามในมือเกี่ยวกับตัวเลือกที่มีอยู่ในภาษาจาวา มันไม่ได้พูดถึงอะไรเกี่ยวกับประเภทของข้อมูลที่จะเข้าไปในสตริง หากมีทางออกที่ดีกว่าคุณสามารถโพสต์เป็นคำตอบได้ ดูเหมือนว่าทางออกของ Josh Currenจะดีกว่าสำหรับสถานการณ์ของคุณ หากคุณรู้สึกเสียใจที่ภาษาไม่รองรับตัวอักษรหลายบรรทัดนี่ก็ผิดที่จะบ่นเกี่ยวกับเรื่องนี้
กีบ

188

ใน Eclipse หากคุณเปิดใช้ตัวเลือก "Escape text เมื่อวางลงในสตริงตัวอักษร" (ในการตั้งค่า> Java> Editor> การพิมพ์) และวางสตริงที่มีหลายบรรทัดซึ่งจะเป็นการเพิ่มโดยอัตโนมัติ"และ\n" +สำหรับทุกบรรทัดของคุณ

String str = "paste your text here";

15
intelij ยังทำสิ่งนี้ตามค่าเริ่มต้นเมื่อคุณวางลงใน "" s
Bob B

โดยทั่วไปแล้วคุณปล่อยไว้ในสิ่ง\rที่ Eclipse ใส่ใน Windows
Noumenon

99

นี่เป็นเธรดเก่า แต่โซลูชันที่สวยงามใหม่ (มีเพียง 4 อาจ 3 ข้อบกพร่องเล็กน้อย) คือการใช้คำอธิบายประกอบที่กำหนดเอง

ตรวจสอบ: http://www.adrianwalker.org/2011/12/java-multiline-string.html

โครงการที่ได้รับแรงบันดาลใจจากงานนั้นโฮสต์บน GitHub:

https://github.com/benelog/multiline

ตัวอย่างของรหัส Java:

import org.adrianwalker.multilinestring.Multiline;
...
public final class MultilineStringUsage {

  /**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

  public static void main(final String[] args) {
    System.out.println(html);
  }
}

ข้อเสียคือ

  1. คุณต้องเปิดใช้งานตัวประมวลผลคำอธิบายประกอบ (ที่มีให้) ที่เกี่ยวข้อง
  2. ตัวแปร String นั้นไม่สามารถกำหนดเป็นตัวแปรท้องถิ่นตรวจสอบโครงการ Raw String Literalsที่คุณสามารถกำหนดตัวแปรเป็นตัวแปรท้องถิ่น
  3. สตริงนั้นไม่สามารถมีตัวแปรอื่น ๆ ได้เช่นเดียวกับใน Visual Basic. Net พร้อม XML literal ( <%= variable %>) :-)
  4. สตริงตัวอักษรถูกคั่นด้วยความคิดเห็น JavaDoc (/ **)

และคุณอาจต้องกำหนดค่า Eclipse / Intellij-Idea เพื่อไม่ให้ฟอร์แมตความคิดเห็น Javadoc ของคุณโดยอัตโนมัติ

หนึ่งอาจพบว่าแปลก (ความเห็น Javadoc ไม่ได้ออกแบบมาเพื่อฝังอะไรนอกเหนือจากความคิดเห็น) แต่เนื่องจากขาดสาย multiline ใน Java นี้เป็นที่น่ารำคาญจริงๆในที่สุดฉันคิดว่านี่เป็นทางออกที่เลวร้ายที่สุดอย่างน้อย


สิ่งนั้นต้องการคลาสที่ใช้สตริงหลายบรรทัดหรือไม่ จำเป็นต้องมีการตั้งค่าใด ๆ เมื่อพัฒนาและดำเนินการโค้ดจาก Eclipse หรือไม่? URL อ้างอิงกล่าวถึงข้อกำหนดการตั้งค่าสำหรับ Maven สำหรับการประมวลผลคำอธิบายประกอบ ฉันไม่สามารถหาสิ่งที่อาจจำเป็นถ้ามีใน Eclipse
David

คำอธิบายประกอบนั้นน่าอยู่ - แต่ดูเหมือนว่ายังมีการพึ่งพาอย่างหนักใน maven? ส่วนนั้นนำคุณค่าของ heredoc มาใช้เพื่อลดความยุ่งยากในการจัดการข้อความขนาดเล็ก
javadba

3
คุณสามารถทำได้ทั้งหมดใน eclipse ลิงก์ที่ @SRG โพสต์ไว้ด้านบนชี้ไปที่ลิงก์นี้ หากคุณใช้ eclipse คุณจะต้องทำการติดตั้งหนึ่งนาทีและจะสามารถใช้งานได้
Michael Plautz

4
นี่อาจเป็นแฮ็คที่ใหญ่ที่สุดที่ฉันเคยเห็น แก้ไข: ไม่เป็นไร ... ดูคำตอบของ Bob Albrights
Llew Vallis

1
ฉันสร้างส่วนขยายของโครงการนี้เป็นสร้างขึ้นใหม่ซึ่งรองรับตัวแปรท้องถิ่นลองดูที่โครงการ
deFreitas

62

ตัวเลือกอื่นอาจจะเก็บสายยาวในไฟล์ภายนอกและอ่านไฟล์ลงในสตริง


13
เผง ข้อความจำนวนมากไม่ได้อยู่ในซอร์ส Java ใช้ไฟล์ทรัพยากรของรูปแบบที่เหมาะสมแทนโหลดผ่านการเรียก Class.getResource (String)
erickson

5
ขวา! คุณสามารถใช้ Locale + ResourceBundle เพื่อโหลดข้อความ I18N ได้อย่างง่ายดายจากนั้นการเรียก String.format () จะแยกบรรทัด "\ n" เป็นบรรทัดใหม่ :) ตัวอย่าง: String readyStr = String.parse (resourceBundle.getString (" บทนำ"));
ATorras

62
คุณไม่ควรจะทำการส่งต่อสตริงภายนอกเพราะมันเป็นหลายบรรทัด จะเกิดอะไรขึ้นถ้าฉันมี regex ที่ฉันต้องการแบ่งเป็นหลายบรรทัดด้วยความคิดเห็น มันดูน่าเกลียดใน Java @ไวยากรณ์สำหรับ C # ทำความสะอาดมาก
Jeremy Stein

8
Skiphoppy ไม่ต้องการรบกวนค่าใช้จ่ายในการจัดการไฟล์เพียงเพื่อใช้ค่าคงที่สตริงความยาวย่อหน้า ฉันใช้สตริงหลายบรรทัดตลอดเวลาใน C ++ ซึ่งฝังอยู่ในซอร์สโค้ดของฉันที่ฉันต้องการ
Tim Cooper

9
ว้าว. ฉันไม่อยากเชื่อเลยว่า C ++ นั้นดีกว่า Java จริง ๆ ในเรื่องนี้! ฉันรักค่าคงที่สตริงหลายบรรทัดและพวกเขาอยู่ในแหล่งในบางกรณี
User1

59

นี่คือสิ่งที่คุณไม่ควรใช้โดยไม่ได้คิดถึงสิ่งที่กำลังทำอยู่ แต่สำหรับสคริปต์ที่ใช้ครั้งเดียวฉันใช้มันด้วยความสำเร็จ:

ตัวอย่าง:

    System.out.println(S(/*
This is a CRAZY " ' ' " multiline string with all sorts of strange 
   characters!
*/));

รหัส:

// From: http://blog.efftinge.de/2008/10/multi-line-string-literals-in-java.html
// Takes a comment (/**/) and turns everything inside the comment to a string that is returned from S()
public static String S() {
    StackTraceElement element = new RuntimeException().getStackTrace()[1];
    String name = element.getClassName().replace('.', '/') + ".java";
    StringBuilder sb = new StringBuilder();
    String line = null;
    InputStream in = classLoader.getResourceAsStream(name);
    String s = convertStreamToString(in, element.getLineNumber());
    return s.substring(s.indexOf("/*")+2, s.indexOf("*/"));
}

// From http://www.kodejava.org/examples/266.html
private static String convertStreamToString(InputStream is, int lineNum) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null; int i = 1;
    try {
        while ((line = reader.readLine()) != null) {
            if (i++ >= lineNum) {
                sb.append(line + "\n");
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return sb.toString();
}

15
ต้องมีการจัดส่งรหัส Java สำหรับชั้นเรียนด้วยไบนารีสุดท้าย อืมมม
Thorbjørn Ravn Andersen

23
ฉันนึกภาพปฏิกิริยาของเพื่อนร่วมงานเมื่อฉันพยายามตรวจสอบสิ่งนี้ใน ...
Landon Kuhn

15
+1 บางคนขาดจินตนาการโดยผู้ลงคะแนน นี่เป็นโครงสร้างที่มีประโยชน์สำหรับการเขียนโปรแกรมอรรถประโยชน์ขนาดเล็กกรณีทดสอบและแม้แต่ในสภาพแวดล้อมที่ควบคุม นี่คือผู้สร้างความแตกต่างระหว่างการปล่อยจาวาสู่ ruby ​​/ python / etc หรืออยู่ที่นี่
javadba

1
วิธีแก้ปัญหาที่ยอดเยี่ยม แต่น่าเสียดายที่มันไม่สามารถใช้งานได้กับ Android เนื่องจากมันจะถูกเรียกใช้งานบนเครื่องจำลองหรืออุปกรณ์จริงและไม่มีซอร์สโค้ดอยู่ที่นั่น
evgeny.myasishchev

อาจเป็น Java 8 prob หรืออย่างอื่น แต่ classLoader ในตัวอย่างไม่มีอยู่จริง ฉันลองใช้ MyClass.class.getResourceAsStream (... ) แต่มันจะคืนค่าเป็นศูนย์เสมอ น่าจะเป็นทางออกที่ดีสำหรับการทดสอบ!
Nick

54

String.join

Java 8 เพิ่มวิธีสแตติกใหม่java.lang.Stringซึ่งเสนอทางเลือกที่ดีกว่าเล็กน้อย:

String.join( CharSequence delimiter , CharSequence... elements )

ใช้มัน:

String s = String.join(
    System.getProperty("line.separator"),
    "First line.",
    "Second line.",
    "The rest.",
    "And the last!"
);

5
ทางออกที่เรียบร้อยและสะอาด! ไม่มีการพึ่งพา IDE และตัวประมวลผลล่วงหน้า! ไม่"\n"จำเป็นต้องใช้คู่มือและตระหนักถึงการพกพา!
งุดชิงโปง - อาสึกะเคนจิ -

1
ฉันเข้าใจว่าความคิดเห็นของฉันไม่มีประโยชน์ แต่มันก็ย้อนไปมากเพื่อค้นหาสิ่งที่เป็นพื้นฐานเช่นสตริง multiline ตามตัวอักษร ทำไม heck จึงไม่สามารถเพิ่มจาวานี้ในสเป็คได้?
dmitry

22

JEP 355: Text Blocks (Preview)มีวัตถุประสงค์เพื่อให้ครอบคลุมฟังก์ชั่นนี้ขณะนี้มันกำลังตั้งเป้าJDK 13เป็นคุณสมบัติตัวอย่าง อนุญาตให้เขียนสิ่งที่ชอบ:

String s = """
    text
    text
    text
  """;

ก่อนหน้า JEP นี้ใน JDK12, JEP 326: Raw String Literalsมีวัตถุประสงค์เพื่อใช้คุณสมบัติที่คล้ายกัน แต่ในที่สุดก็ถูกถอนออก


2
พวกเขายกเลิกการสนับสนุนนี้
deFreitas

2
บล็อคข้อความตอนนี้เป็นส่วนหนึ่งของ Java 13
ZhekaKozlov

19

หากคุณกำหนดสตริงในไฟล์คุณสมบัติมันจะดูแย่กว่านั้น IIRC ดูเหมือนว่า:

string:text\u000atext\u000atext\u000a

โดยทั่วไปแล้วเป็นความคิดที่สมเหตุสมผลที่จะไม่ฝังสตริงขนาดใหญ่ไว้ในแหล่งที่มา คุณอาจต้องการโหลดมันเป็นทรัพยากรบางทีใน XML หรือรูปแบบข้อความที่อ่านได้ ไฟล์ข้อความสามารถอ่านได้ตอนรันไทม์หรือเรียบเรียงเป็นแหล่ง Java หากคุณวางลงในแหล่งที่มาฉันขอแนะนำให้วาง+ที่ด้านหน้าและละเว้นบรรทัดใหม่ที่ไม่จำเป็น:

final String text = ""
    +"text "
    +"text "
    +"text"
;

หากคุณมีบรรทัดใหม่คุณอาจต้องการวิธีการเข้าร่วมหรือการจัดรูปแบบบางอย่าง:

final String text = join("\r\n"
    ,"text"
    ,"text"
    ,"text"
);

17

เครื่องหมายบวกจะถูกแปลงเป็น StringBuilder.append ยกเว้นเมื่อทั้งสองสตริงเป็นค่าคงที่เพื่อให้คอมไพเลอร์สามารถรวมกันได้ในเวลารวบรวม อย่างน้อยนั่นก็เป็นวิธีในคอมไพเลอร์ของซันและฉันก็สงสัยว่าถ้าคอมไพเลอร์อื่นไม่ทำเช่นเดียวกัน

ดังนั้น:

String a="Hello";
String b="Goodbye";
String c=a+b;

โดยปกติจะสร้างรหัสเดียวกันเป็น:

String a="Hello";
String b="Goodbye":
StringBuilder temp=new StringBuilder();
temp.append(a).append(b);
String c=temp.toString();

ในทางกลับกัน:

String c="Hello"+"Goodbye";

เหมือนกับ:

String c="HelloGoodbye";

นั่นคือไม่มีโทษในการทำลายตัวอักษรสตริงของคุณในหลายบรรทัดพร้อมเครื่องหมายบวกสำหรับการอ่าน


4
จะเป็นเทคนิคในตัวอย่างแรกของคุณมันสร้างสิ่งที่ชอบ: String c = new StringBuilder () ผนวก (a). ผนวก (b) .toString (); ความแตกต่างอยู่ที่ตัวสร้างสตริงชั่วคราวอยู่นอกขอบเขตและมีสิทธิ์สำหรับการรวบรวมขยะทันทีหลังจากสายสตริง c = ... ในขณะที่ตัวสร้างสตริง "temp" จะคงอยู่ต่อไปอีกเล็กน้อย
กีบ

จริง แน่นอนว่าจุดของฉันคือการแยกความแตกต่างเมื่อฟังก์ชั่นได้รับการเรียกในเวลาทำงานเมื่อเทียบกับเมื่องานสามารถทำได้ในเวลารวบรวม แต่คุณถูกต้อง
Jay

15

ใน IntelliJ IDE คุณเพียงแค่ต้องพิมพ์:

""

จากนั้นวางเคอร์เซอร์ของคุณไว้ในเครื่องหมายคำพูดแล้ววางสตริงของคุณ IDE จะขยายเข้าไปในหลาย ๆ เส้นที่ต่อกัน


11

น่าเศร้าที่ Java ไม่มีตัวอักษรสตริงหลายบรรทัด คุณต้องต่อสตริงตัวอักษร (โดยใช้ + หรือ StringBuilder ซึ่งเป็นวิธีการทั่วไปสองวิธีนี้) หรืออ่านสตริงจากไฟล์แยกต่างหาก

สำหรับตัวอักษรสตริงหลายบรรทัดขนาดใหญ่ฉันมีแนวโน้มที่จะใช้ไฟล์แยกต่างหากและอ่านในการใช้getResourceAsStream()(วิธีการClassเรียน) สิ่งนี้ทำให้ง่ายต่อการค้นหาไฟล์เนื่องจากคุณไม่ต้องกังวลกับไดเรกทอรีปัจจุบันเมื่อเทียบกับที่ติดตั้งรหัสของคุณ มันยังทำให้การบรรจุภัณฑ์ง่ายขึ้นเพราะคุณสามารถจัดเก็บไฟล์ไว้ในไฟล์ jar ได้

สมมติว่าคุณอยู่ในชั้นเรียนที่เรียกว่าฟู ทำอะไรแบบนี้:

Reader r = new InputStreamReader(Foo.class.getResourceAsStream("filename"), "UTF-8");
String s = Utils.readAll(r);

สิ่งที่น่ารำคาญอีกอย่างหนึ่งคือ Java ไม่มีวิธี "อ่านข้อความทั้งหมดจากตัวอ่านนี้เป็นสตริง" แบบมาตรฐาน มันค่อนข้างง่ายที่จะเขียนว่า:

public static String readAll(Reader input) {
    StringBuilder sb = new StringBuilder();
    char[] buffer = new char[4096];
    int charsRead;
    while ((charsRead = input.read(buffer)) >= 0) {
        sb.append(buffer, 0, charsRead);
    }
    input.close();
    return sb.toString();
}

ฉันทำเช่นเดียวกัน คุณสามารถใช้ commons-io เพื่ออ่านเนื้อหาของไฟล์ได้ง่ายขึ้น (ด้วย "FileUtils.readFileToString (ไฟล์ไฟล์)")
SRG

ไม่เป็นความจริงอีกต่อไปเกี่ยวกับjava ไม่มีมาตรฐานอ่านวิธีข้อความทั้งหมด ... - ตั้งแต่ Java 7 คุณสามารถใช้Files.readAllLines (Path)
ccpizza

10
String newline = System.getProperty ("line.separator");
string1 + newline + string2 + newline + string3

แต่ทางเลือกที่ดีที่สุดคือการใช้String.format

String multilineString = String.format("%s\n%s\n%s\n",line1,line2,line3);

ความคิดเห็นของฉันคือมันลบเครื่องหมายบวกและคำพูดทำให้อ่านได้มากขึ้นโดยเฉพาะเมื่อมีมากกว่า 3 บรรทัด ไม่ดีเท่า String.format แม้ว่า
Tom

2
ตัวอย่าง Stringbuilder อย่างน้อยที่สุดก็อ่านไม่ได้ อย่าลืมว่า "\ n" ไม่ใช่บรรทัดใหม่เสมอไป แต่มันก็ดีสำหรับเครื่อง linux และ unix
Stefan Thyberg

นอกจากนี้เพียงต้องการพูดถึงการดำรงอยู่ของ StringBuilder
Tom

4
การแทนที่เครื่องหมายบวกหนึ่งอันด้วยชื่อวิธีการหกตัวและวงเล็บไม่ได้อ่านได้ง่ายขึ้นสำหรับฉันแม้ว่าจะเห็นได้ชัดว่าคุณไม่ใช่คนเดียวที่คิดแบบนั้น มันไม่ได้ลบคำพูดออกไป พวกเขายังคงอยู่ที่นั่น
skiphoppy

9

เนื่องจาก Java ไม่ได้สนับสนุนสตริงแบบหลายบรรทัด (ดั้งเดิม) วิธีเดียวสำหรับตอนนี้คือการแฮ็กข้อมูลโดยใช้หนึ่งในเทคนิคดังกล่าวข้างต้น ฉันสร้างสคริปต์ Python ต่อไปนี้โดยใช้เทคนิคบางอย่างที่กล่าวถึงข้างต้น:

import sys
import string
import os

print 'new String('
for line in sys.stdin:
    one = string.replace(line, '"', '\\"').rstrip(os.linesep)
    print '  + "' + one + ' "'
print ')'

วางในไฟล์ชื่อ javastringify.py และสตริงของคุณในไฟล์ mystring.txt และเรียกใช้ดังต่อไปนี้:

cat mystring.txt | python javastringify.py

จากนั้นคุณสามารถคัดลอกผลลัพธ์และวางลงในโปรแกรมแก้ไขของคุณ

แก้ไขสิ่งนี้ตามต้องการเพื่อจัดการกับกรณีพิเศษใด ๆ แต่สิ่งนี้ใช้ได้กับความต้องการของฉัน หวังว่านี่จะช่วยได้!


9

คุณสามารถใช้รหัสสกาล่าซึ่งเข้ากันได้กับจาวาและอนุญาตให้ใช้หลายสายอักขระที่ล้อมรอบด้วย "" ":

package foobar
object SWrap {
  def bar = """John said: "This is
  a test
  a bloody test,
  my dear." and closed the door.""" 
}

(สังเกตคำพูดในสตริง) และจากจาวา:

String s2 = foobar.SWrap.bar ();

ไม่ว่าจะสะดวกสบายกว่านี้ ...

อีกวิธีหนึ่งหากคุณมักจะจัดการกับข้อความที่ยาวซึ่งควรอยู่ในซอร์สโค้ดของคุณอาจเป็นสคริปต์ซึ่งใช้ข้อความจากไฟล์ภายนอกและตัดมันเป็น multiline-java-String ดังนี้:

sed '1s/^/String s = \"/;2,$s/^/\t+ "/;2,$s/$/"/' file > file.java

เพื่อให้คุณสามารถตัดและวางลงในแหล่งที่มาของคุณได้อย่างง่ายดาย


8

คุณสามารถต่อท้ายผนวกของคุณด้วยวิธีอื่นเช่น:

public static String multilineString(String... lines){
   StringBuilder sb = new StringBuilder();
   for(String s : lines){
     sb.append(s);
     sb.append ('\n');
   }
   return sb.toString();
}

ทั้งสองวิธีเลือกStringBuilderใช้เครื่องหมายบวก


5
ทำไมฉันถึงชอบ StringBuilder ถึงเครื่องหมายบวก?
skiphoppy

10
ประสิทธิภาพหรือความพยายามที่เข้าใจผิดบ่อยครั้ง
Michael Myers

2
ฉันคิดว่าความพยายามในการใช้งานอย่างมีประสิทธิภาพนั้นขึ้นอยู่กับความจริงที่ว่าคอมไพเลอร์ Java ใช้ตัวดำเนินการเชื่อมต่อสตริงโดยใช้ StringBuilder (StringBuffer ในคอมไพเลอร์ pre-1.5) มีบทความเก่า แต่มีชื่อเสียงที่ระบุว่ามีประโยชน์ด้านประสิทธิภาพในบางสถานการณ์ในการใช้ StringBuffer (หรือ StringBuilder ตอนนี้) นี่คือลิงค์ของ: java.sun.com/developer/JDCTechTips/2002/tt0305.html
Paul Morie

4
เมื่อคอมไพเลอร์ไม่สามารถทำได้ สำหรับตัวอักษรและค่าคงที่หากคุณใช้เครื่องหมายบวกการต่อข้อมูลจะกระทำในเวลาคอมไพล์ การใช้ StringBuilder บังคับให้มันเกิดขึ้นตอนรันไทม์ดังนั้นมันจึงไม่เพียง แต่ทำงานได้มากกว่า แต่ช้ากว่า
johncip

7

อันที่จริงต่อไปนี้คือการนำไปปฏิบัติที่สะอาดที่สุดเท่าที่ฉันเคยเห็นมา มันใช้คำอธิบายประกอบในการแปลงความคิดเห็นเป็นตัวแปรสตริง ...

/**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

ดังนั้นผลลัพธ์ที่ได้คือตัวแปร html ประกอบด้วยสตริงหลายบรรทัด ไม่มีเครื่องหมายอัญประกาศไม่มีเครื่องหมายบวกไม่มีเครื่องหมายจุลภาคเพียงสตริงบริสุทธิ์

โซลูชันนี้มีให้ที่ URL ต่อไปนี้ ... http://www.adrianwalker.org/2011/12/java-multiline-string.html

หวังว่าจะช่วย!


หน่วยประมวลผลบันทึกย่อที่ต้องมีการตรวจสอบที่แข็งแกร่งมากขึ้น
Tripp จลนพลศาสตร์

ฉันชอบสิ่งนี้. ลองใช้
javadba

7

ดูJava Stringfier เปลี่ยนข้อความของคุณให้เป็นบล็อก java StringBuilder ที่หลบหนีหากจำเป็น


1
ใช่เพราะฉันสามารถใช้ชีวิตสำเนาและวางลงในไซต์นั้น ฉันยังสามารถเก็บไว้ในไฟล์และโหลดได้ แต่นั่นไม่ใช่วิธีแก้ปัญหาในอุดมคติ
mmm

7
    import org.apache.commons.lang3.StringUtils;

    String multiline = StringUtils.join(new String[] {
        "It was the best of times, it was the worst of times ", 
        "it was the age of wisdom, it was the age of foolishness",
        "it was the epoch of belief, it was the epoch of incredulity",
        "it was the season of Light, it was the season of Darkness",
        "it was the spring of hope, it was the winter of despair",
        "we had everything before us, we had nothing before us",
        }, "\n");

6

ทางเลือกที่ฉันยังไม่เห็นว่าเป็นคำตอบ java.io.PrintWriterทางเลือกที่ฉันไม่ได้เห็นเป็นคำตอบที่ยังเป็น

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
writer.println("It was the best of times, it was the worst of times");
writer.println("it was the age of wisdom, it was the age of foolishness,");
writer.println("it was the epoch of belief, it was the epoch of incredulity,");
writer.println("it was the season of Light, it was the season of Darkness,");
writer.println("it was the spring of hope, it was the winter of despair,");
writer.println("we had everything before us, we had nothing before us");
String string = stringWriter.toString();

ความจริงที่ว่าjava.io.BufferedWriterมีnewLine()วิธีการที่ไม่ได้กล่าวถึง


5

ถ้าคุณชอบฝรั่งของ Google มากเท่ากับที่ฉันทำมันสามารถให้การแสดงที่ค่อนข้างสะอาดและเป็นวิธีที่ดีและง่ายที่จะไม่เข้ารหัสอักขระบรรทัดใหม่ของคุณด้วย:

String out = Joiner.on(newline).join(ImmutableList.of(
    "line1",
    "line2",
    "line3"));

5

Properties.loadFromXML(InputStream)ใช้ ไม่จำเป็นต้องใช้ libs ภายนอก

ดีกว่ารหัสยุ่ง (เนื่องจากการบำรุงรักษาและการออกแบบเป็นปัญหาของคุณ) มันจะดีกว่าที่จะไม่ใช้สายยาว

เริ่มต้นด้วยการอ่านคุณสมบัติ xml:

 InputStream fileIS = YourClass.class.getResourceAsStream("MultiLine.xml");
 Properties prop = new Properies();
 prop.loadFromXML(fileIS);


จากนั้นคุณสามารถใช้สตริงหลายบรรทัดของคุณในวิธีที่บำรุงรักษาได้มากกว่า ...

static final String UNIQUE_MEANINGFUL_KEY = "Super Duper UNIQUE Key";
prop.getProperty(UNIQUE_MEANINGFUL_KEY) // "\n    MEGA\n   LONG\n..."


MultiLine.xml` ได้รับอยู่ในโฟลเดอร์เดียวกัน YourClass:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>
    <entry key="Super Duper UNIQUE Key">
       MEGA
       LONG
       MULTILINE
    </entry>
</properties>

ป.ล. : คุณสามารถใช้<![CDATA["... "]]>สำหรับสตริงที่เหมือน xml


ใช่นี่คือสิ่งที่ฉันใช้เช่นกันทางออกที่ยอดเยี่ยม! ย้าย SQL หรือ XML ออกเป็นไฟล์คุณสมบัติ XML ภายนอก มันไม่ได้ยุ่งรหัส :)
Laszlo Lugosi

นี่ไม่ได้ตอบคำถาม ของ heredoc โดยมีความหมายในไฟล์ จุดคือการเก็บไว้ในที่เดียว
javadba

5

ด้วยJDK / 12 Early access build # 12ตอนนี้หนึ่งสามารถใช้สตริงหลายบรรทัดใน Java ดังนี้:

String multiLine = `First line
    Second line with indentation
Third line
and so on...`; // the formatting as desired
System.out.println(multiLine);

และผลลัพธ์นี้ในผลลัพธ์ต่อไปนี้:

First line
    Second line with indentation
Third line
and so on...

แก้ไข: เลื่อนออกไปเป็น java 13


1
นี่คือวิธีการทดลองใช้ maven
Naman

2
ตามที่ cybersoft พูดถึงความคิดเห็นอื่น ๆ ตัวอักษรสตริงดิบ (JEP326) ได้ถูกลบออกจาก JDK12 ขั้นสุดท้าย แต่ JEP อื่นถูกสร้างขึ้นเพื่อเพิ่ม "บล็อกข้อความ" ที่อาจจะทำตามตัวอย่างใน JDK 13
Manuel Romeiro

4

โซลูชันที่ค่อนข้างมีประสิทธิภาพและแพลตฟอร์มอิสระจะใช้คุณสมบัติของระบบสำหรับตัวแยกบรรทัดและคลาส StringBuilder เพื่อสร้างสตริง:

String separator = System.getProperty("line.separator");
String[] lines = {"Line 1", "Line 2" /*, ... */};

StringBuilder builder = new StringBuilder(lines[0]);
for (int i = 1; i < lines.length(); i++) {
    builder.append(separator).append(lines[i]);
}
String multiLine = builder.toString();

4

ทางเลือกที่ดีอย่างหนึ่ง

import static some.Util.*;

    public class Java {

        public static void main(String[] args) {

            String sql = $(
              "Select * from java",
              "join some on ",
              "group by"        
            );

            System.out.println(sql);
        }

    }


    public class Util {

        public static String $(String ...sql){
            return String.join(System.getProperty("line.separator"),sql);
        }

    }

4

นี่เป็นคำถามที่พบบ่อยมากดังนั้นผมจึงตัดสินใจที่จะเปิดคำตอบนี้ลงในบทความได้เป็นอย่างดี

Java 13 ขึ้นไป

หลายสายได้รับการสนับสนุนในขณะนี้ใน Java ผ่านบล็อกข้อความ ใน Java 13 และ 14 คุณลักษณะนี้ต้องการให้คุณตั้งค่า––enable–previewตัวเลือกเมื่อสร้างและเรียกใช้โครงการของคุณ ตรวจสอบเอกสารประกอบ Java นี้สำหรับรายละเอียดเพิ่มเติม

ตอนนี้ก่อนหน้า Java 13 นี่คือวิธีที่คุณเขียนแบบสอบถาม:

List<Tuple> posts = entityManager
.createNativeQuery(
    "SELECT *\n" +
    "FROM (\n" +
    "    SELECT *,\n" +
    "           dense_rank() OVER (\n" +
    "               ORDER BY \"p.created_on\", \"p.id\"\n" +
    "           ) rank\n" +
    "    FROM (\n" +
    "        SELECT p.id AS \"p.id\",\n" +
    "               p.created_on AS \"p.created_on\",\n" +
    "               p.title AS \"p.title\",\n" +
    "               pc.id as \"pc.id\",\n" +
    "               pc.created_on AS \"pc.created_on\",\n" +
    "               pc.review AS \"pc.review\",\n" +
    "               pc.post_id AS \"pc.post_id\"\n" +
    "        FROM post p\n" +
    "        LEFT JOIN post_comment pc ON p.id = pc.post_id\n" +
    "        WHERE p.title LIKE :titlePattern\n" +
    "        ORDER BY p.created_on\n" +
    "    ) p_pc\n" +
    ") p_pc_r\n" +
    "WHERE p_pc_r.rank <= :rank\n",
    Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();

ขอบคุณ Java 13 Text Blocks คุณสามารถเขียนแบบสอบถามนี้ใหม่ดังนี้

List<Tuple> posts = entityManager
.createNativeQuery("""
    SELECT *
    FROM (
        SELECT *,
               dense_rank() OVER (
                   ORDER BY "p.created_on", "p.id"
               ) rank
        FROM (
            SELECT p.id AS "p.id",
                   p.created_on AS "p.created_on",
                   p.title AS "p.title",
                   pc.id as "pc.id",
                   pc.created_on AS "pc.created_on",
                   pc.review AS "pc.review",
                   pc.post_id AS "pc.post_id"
            FROM post p
            LEFT JOIN post_comment pc ON p.id = pc.post_id
            WHERE p.title LIKE :titlePattern
            ORDER BY p.created_on
        ) p_pc
    ) p_pc_r
    WHERE p_pc_r.rank <= :rank
    """,
    Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();

อ่านได้มากขึ้นใช่มั้ย

การสนับสนุน IDE

IntelliJ IDEA ให้การสนับสนุนสำหรับการแปลงStringบล็อกการต่อข้อมูลดั้งเดิมเป็นStringรูปแบบหลายบรรทัดใหม่:

รองรับ IntelliJ IDEA Text Blocks

JSON, HTML, XML

multiline Stringมีประโยชน์อย่างยิ่งเมื่อเขียน JSON, HTML หรือ XML

พิจารณาตัวอย่างนี้โดยใช้การStringต่อข้อมูลเพื่อสร้างสตริงตัวอักษร JSON:

entityManager.persist(
    new Book()
    .setId(1L)
    .setIsbn("978-9730228236")
    .setProperties(
        "{" +
        "   \"title\": \"High-Performance Java Persistence\"," +
        "   \"author\": \"Vlad Mihalcea\"," +
        "   \"publisher\": \"Amazon\"," +
        "   \"price\": 44.99," +
        "   \"reviews\": [" +
        "       {" +
        "           \"reviewer\": \"Cristiano\", " +
        "           \"review\": \"Excellent book to understand Java Persistence\", " +
        "           \"date\": \"2017-11-14\", " +
        "           \"rating\": 5" +
        "       }," +
        "       {" +
        "           \"reviewer\": \"T.W\", " +
        "           \"review\": \"The best JPA ORM book out there\", " +
        "           \"date\": \"2019-01-27\", " +
        "           \"rating\": 5" +
        "       }," +
        "       {" +
        "           \"reviewer\": \"Shaikh\", " +
        "           \"review\": \"The most informative book\", " +
        "           \"date\": \"2016-12-24\", " +
        "           \"rating\": 4" +
        "       }" +
        "   ]" +
        "}"
    )
);

คุณแทบจะไม่สามารถอ่าน JSON ได้เนื่องจากตัวละครที่กำลังหลบหนีและความอุดมสมบูรณ์ของเครื่องหมายคำพูดคู่และเครื่องหมายบวก

ด้วย Java Text Blocks วัตถุ JSON สามารถเขียนได้เช่นนี้

entityManager.persist(
    new Book()
    .setId(1L)
    .setIsbn("978-9730228236")
    .setProperties("""
        {
           "title": "High-Performance Java Persistence",
           "author": "Vlad Mihalcea",
           "publisher": "Amazon",
           "price": 44.99,
           "reviews": [
               {
                   "reviewer": "Cristiano",
                   "review": "Excellent book to understand Java Persistence",
                   "date": "2017-11-14",
                   "rating": 5
               },
               {
                   "reviewer": "T.W",
                   "review": "The best JPA ORM book out there",
                   "date": "2019-01-27",
                   "rating": 5
               },
               {
                   "reviewer": "Shaikh",
                   "review": "The most informative book",
                   "date": "2016-12-24",
                   "rating": 4
               }
           ]
        }
        """
    )
);

นับตั้งแต่ฉันใช้ C # ในปี 2004 ฉันต้องการได้รับคุณลักษณะนี้ใน Java และตอนนี้เราก็มีมันแล้ว


3

กำหนดสตริงของฉันในไฟล์คุณสมบัติหรือไม่

ไม่อนุญาตให้ใช้สตริงหลายบรรทัดในไฟล์คุณสมบัติ คุณสามารถใช้ \ n ในไฟล์คุณสมบัติได้ แต่ฉันไม่คิดว่ามันจะเป็นทางออกในกรณีของคุณ


ค่าในไฟล์คุณสมบัติสามารถขยายได้หลายบรรทัด: เพียงแค่จบทุกบรรทัด แต่สุดท้ายด้วยแบ็กสแลช สิ่งนี้จะทำให้ปัญหาของสิ่งที่คุณใช้เป็นตัวแยกบรรทัดเนื่องจากนี่เป็นแพลตฟอร์มเฉพาะ ฉันคิดว่าคุณสามารถใช้ง่าย \ n แล้วในรหัสของคุณหลังจากอ่านคุณสมบัติแล้วให้ทำการค้นหาและแทนที่ \ n เป็น line.separator ดูเหมือนว่าจะเป็น kludge เล็ก ๆ น้อย ๆ แต่ฉันคิดว่าคุณสามารถเขียนฟังก์ชั่นที่ดึงคุณสมบัติและจัดการกับมันได้ในเวลาเดียวกัน ทุกอย่างสมมติว่าคุณกำลังเขียนสตริงเหล่านี้ลงในไฟล์ซึ่งเป็นข้อสันนิษฐานที่ยิ่งใหญ่
เจ

3

ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับนักพัฒนา intersted ตัวอักษรหลายบรรทัดจะอยู่ใน # Java12

http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html


Nope แต่ไม่จนทำให้มันสำหรับ Java 13. ซึ่งทีมของฉันมีแนวโน้มที่จะนำมาใช้ในการประมาณครึ่งทศวรรษที่ผ่านมา
javadba

3

ฉันขอแนะนำให้ใช้ยูทิลิตี้ตามที่ ThomasP แนะนำจากนั้นเชื่อมโยงไปยังกระบวนการสร้างของคุณ ไฟล์ภายนอกยังคงมีอยู่เพื่อให้มีข้อความ แต่ไฟล์จะไม่อ่านที่รันไทม์ เวิร์กโฟลว์คือ:

  1. สร้างยูทิลิตี้ 'textfile to java code' และตรวจสอบการควบคุมเวอร์ชัน
  2. ในแต่ละบิลด์ให้รันยูทิลิตีเทียบกับไฟล์ทรัพยากรเพื่อสร้างซอร์ส Java ที่ได้รับการแก้ไข
  3. แหล่งที่มาของ Java ประกอบด้วยส่วนหัวเช่น class TextBlock {...ตามด้วยสตริงคงที่ซึ่งสร้างขึ้นโดยอัตโนมัติจากไฟล์ทรัพยากร
  4. สร้างไฟล์ java ที่สร้างโดยใช้โค้ดที่เหลือของคุณ

2

เมื่อใช้ชุดยาวของ + จะมีการสร้าง StringBuilder เพียงชุดเดียวเว้นแต่จะมีการกำหนดสตริงในเวลารวบรวมในกรณีที่ไม่มีการใช้ StringBuilder!

StringBuilder ครั้งเดียวเท่านั้นที่มีประสิทธิภาพมากกว่าคือเมื่อมีการใช้คำสั่งหลายคำสั่งเพื่อสร้างสตริง

String a = "a\n";
String b = "b\n";
String c = "c\n";
String d = "d\n";

String abcd = a + b + c + d;
System.out.println(abcd);

String abcd2 = "a\n" +
        "b\n" +
        "c\n" +
        "d\n";
System.out.println(abcd2);

หมายเหตุ: สร้าง StringBuilder เดียวเท่านั้น

  Code:
   0:   ldc     #2; //String a\n
   2:   astore_1
   3:   ldc     #3; //String b\n
   5:   astore_2
   6:   ldc     #4; //String c\n
   8:   astore_3
   9:   ldc     #5; //String d\n
   11:  astore  4
   13:  new     #6; //class java/lang/StringBuilder
   16:  dup
   17:  invokespecial   #7; //Method java/lang/StringBuilder."<init>":()V
   20:  aload_1
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:  aload_2
   25:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   28:  aload_3
   29:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   32:  aload   4
   34:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   37:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   40:  astore  5
   42:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   45:  aload   5
   47:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   50:  ldc     #12; //String a\nb\nc\nd\n
   52:  astore  6
   54:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   57:  aload   6
   59:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   62:  return

เพื่อชี้แจงคำถามของฉันเพิ่มเติมฉันไม่ได้กังวลเกี่ยวกับประสิทธิภาพเลย ฉันกังวลเกี่ยวกับการบำรุงรักษาและปัญหาการออกแบบ

ทำให้ชัดเจนและเรียบง่ายเท่าที่จะทำได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.