ฉันจะรับอักขระขึ้นบรรทัดใหม่ได้อย่างไร


542

ฉันจะรับการขึ้นบรรทัดใหม่ขึ้นอยู่กับแพลตฟอร์มใน Java ได้อย่างไร ฉันไม่สามารถใช้งานได้"\n"ทุกที่


โปรดพิจารณาการเปลี่ยนคำตอบที่ยอมรับได้ คำตอบที่ 2 เหมาะสมกว่า
สีเทา

คำตอบ:


364

นอกเหนือจากคุณสมบัติ line.separator หากคุณใช้ java 1.5 ขึ้นไปและString.format (หรือวิธีการจัดรูปแบบอื่น ๆ) คุณสามารถใช้งานได้%nเช่นเดียวกับใน

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

ดูJava 1.8 API สำหรับฟอร์แมตเตอร์สำหรับรายละเอียดเพิ่มเติม


7
ขอบคุณ! ฉันแน่ใจว่า System.getProperty ("line.separator"); มีประโยชน์ แต่ฉันเบื่อที่จะเห็น: "Line 1" + System.getProperty ("line.separator") + "Line 2"
Buttons840

43
โอ้ "Line 1" + System.getProperty ("line.separator") + "Line 2" เป็นหนึ่งในสิ่งที่น่าเกลียดที่สุดที่ฉันเคยเห็น เพียงแค่ประกาศค่าคงที่อื่น ๆ จะเจ็บปวดน้อยลง
abahgat

4
อย่างน้อยก็ใช้งานไม่ได้กับสตริงที่เข้าสู่คำสั่ง log4j การสร้างตัวอย่างด้วยการขึ้นบรรทัดใหม่ในตอนท้ายอาจซ่อนปัญหาได้ นอกจากนี้ String s2 ยังสับสนโดยใช้ '%% n'
Stealth Rabbi

6
อย่าใช้สิ่งนี้หากสตริงของคุณอาจมี%จากผู้ใช้ป้อน!
Konstantin Weitz

8
@KonstantinWeitz ปัญหาของการแก้ไขได้อย่างง่ายดายโดยString.format(s + "%n") String.format("%s%n", s)มันมีความเสี่ยงเสมอที่จะเกี่ยวข้องกับการป้อนข้อมูลของผู้ใช้เป็นเนื้อหาของรูปแบบ (ในลักษณะเดียวกับeval())
Franklin Yu

710

Java 7 ตอนนี้มีSystem.lineSeparator()วิธีการ


8
น่าจะดีมาก ๆ สำหรับพวกเขาที่จะให้วิธีการโอเวอร์โหลดlineSeperator(int)ซึ่งจะคืนค่าจำนวนบรรทัดของ seperators เนื่องจากฉันมักจะพบว่าตัวเองใช้ 2 พร้อมกัน
Kon

10
@Kon ตามคำตอบนี้ :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
ด้วย Java 11:System.lineSeparator().repeat(5)
Jacob G.

4
@JacobG หยุดจ้องมอง .. เราบางคนยังคงติดอยู่บน Java 7
Andrew T Finnell

@AndrewTFinnell ฉันจะหางานที่ดีขึ้น <:-P ไม่มีตู้คอนเทนเนอร์ -> ไม่มี Java 11 ดังนั้นคุณจะได้รับเงินเดือนที่ดีขึ้นเราสามารถเห็นด้วย:
Aubergine

650

คุณสามารถใช้ได้

System.getProperty("line.separator");

เพื่อรับตัวแยกบรรทัด


4
สนใจเพิ่มSystem.lineSeparator()รายละเอียดJava 7 ดังนั้นนี่คือคำตอบที่ชัดเจนสำหรับคำถามนี้
สีเทา


31

เป็นไปได้เช่นกัน: String.format("%n") .

หรือString.format("%n").intern()เพื่อบันทึกบางไบต์


7
นี่เป็นคำตอบเดียวกับ Alex B
Spoike

16
โอ้ตอนนี้ฉันเห็นแล้ว เขาเขียนสิ่งที่ไม่ได้ถามมากเกี่ยวกับคำตอบของเขา ;-)
ceving

ฉันได้ลองทำสิ่งนี้แล้ว แต่เมื่อฉันดูไฟล์ในแผ่นจดบันทึกมันไม่รู้จักบรรทัดใหม่
mr5

1
@ mr5 notepadไม่ใช่เครื่องมือที่เหมาะสมในการดูเนื้อหาของไฟล์ ใช้หรือhexdump od
เซเว่น

@ เห็นว่าฉันอยู่ในสภาพแวดล้อมของ Windows และฉันคาดหวังว่าบรรทัดใหม่จะเป็นการรวมกันของ\r\n
mr5

22

คอมมอน-langห้องสมุดมีข้อมูลคงที่เรียกว่าใช้ได้SystemUtils.LINE_SEPARATOR


19
ใช่ติดตั้งไลบรารีของบุคคลที่สามเพื่อรับแพลตฟอร์มบรรทัดใหม่ที่เป็นอิสระ! #facepalm
Shervin Asgari

23
@Shervin แน่นอนว่าคุณจะไม่ทำเช่นนั้น แต่หลายโครงการที่ฉันได้ทำไปแล้วใช้คอมมอนส์แลงและ Java เวอร์ชันเก่า ดังนั้นหากคุณกำลังใช้งานคอมมอนส์อยู่แล้วนี่เป็นคำตอบที่สมเหตุสมผล ฉันไม่รู้สึกว่าจำเป็นต้องชี้ให้เห็นว่าฉันผิดอย่างเห็นได้ชัด
lexicalscope

2
นี่เป็นข้อเสนอแนะที่ดีสำหรับโครงการที่ใช้ห้องสมุดนี้อยู่แล้วขอบคุณ!
Alexis Leclerc

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

ตัวอย่างด้านบนจะมีสองสตริงคั่นด้วยบรรทัดใหม่โดยไม่คำนึงถึงแพลตฟอร์ม


13

หากคุณกำลังเขียนไปยังไฟล์โดยใช้BufferedWriterอินสแตนซ์ให้ใช้newLine()วิธีการของอินสแตนซ์นั้น เป็นวิธีที่ไม่ขึ้นกับแพลตฟอร์มในการเขียนบรรทัดใหม่ในไฟล์



-3

หลีกเลี่ยงการต่อท้ายสตริงโดยใช้ String + String ฯลฯ ใช้ StringBuilder แทน

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
สิ่งนี้ไม่สำคัญในกรณีส่วนใหญ่Jeff Atwood ของ Coding Horror ได้โพสต์บล็อกเกี่ยวกับการเพิ่มประสิทธิภาพขนาดเล็กแบบนี้ ทำตัวชี้วัดเสมอก่อนทำการอ้างสิทธิ์เช่น "ไม่ทำstring + string"
Spoike

6
ฉันจะบอกว่าบทความของ Jeff อาจจะปิดไปบ้างเพราะมันแค่แตะเวลาดำเนินการเท่านั้น การต่อสตริงใน Java ไม่เพียง แต่เกี่ยวกับความเร็วในการเรียกใช้งานเท่านั้น แต่ยังรวมถึงจำนวนขยะที่คุณทิ้งไว้ในหน่วยความจำเพื่อให้ GC ทำความสะอาดซึ่งอาจทำให้ GC ทำงานบ่อยขึ้น สิ่งนี้อาจจะใช่หรือไม่ใช่ปัญหาขึ้นอยู่กับสภาพแวดล้อมและการกำหนดค่าของคุณ
Lajcik

7
Lajcik ฉันคิดว่ามันเป็นการเพิ่มประสิทธิภาพล่วงหน้าสำหรับทุกกรณียกเว้นผู้ที่จัดการสตริงมาก ๆ StringBuffer เป็นรูปแบบการต่อต้านสำหรับความต้องการการเชื่อมโยงเล็กน้อย ในหลายกรณีฉันอยากจะอ่าน String1 + separator + String2 มากกว่าตัวอย่างหลายบรรทัดข้างต้น นอกจากนี้ฉันขอแนะนำให้ทดสอบว่าหน่วยความจำและ GC ได้รับผลกระทบในเชิงบวกหรือไม่โดยการเพิ่ม SB ในหลายกรณีฉันคิดว่ามันไม่ใช่ หากการทดสอบไม่คุ้มค่าอาจเป็นการปรับค่าล่วงหน้าและฉันจะเน้นเรื่องการอ่าน
Richard Watson

31
การทำ String1 + String2 เหมือนกับการสร้าง StringBuilder ใหม่ (String1). ผนวก (String2) ในคอมไพเลอร์สมัยใหม่ดังนั้นจึงไม่มีการปรับให้เหมาะสมสำหรับสายซับเดียว StringBuilder เป็นค่าทั่วไปในลูปหรือวิธีการเรียกซ้ำ แต่อย่างไรก็ตามนี่อาจไม่อยู่ในขอบเขตของคำถามเดิม
user327961

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