เกิดอะไรขึ้นกับ“% n” ของ Java ใน printf


107

ฉันกำลังอ่าน Effective Java และใช้%nสำหรับอักขระขึ้นบรรทัดใหม่ทุกที่ ฉันใช้\nค่อนข้างประสบความสำเร็จสำหรับการขึ้นบรรทัดใหม่ในโปรแกรม Java

ข้อใด "ถูกต้อง" เกิดอะไรขึ้น\n? เหตุใด Java จึงเปลี่ยนรูปแบบ C นี้


1
เป็นเพียงการคาดเดา แต่: การสนับสนุนข้ามแพลตฟอร์ม ระบบต่างๆใช้อักขระที่แตกต่างกันสำหรับการขึ้นบรรทัดใหม่เช่น \ n เทียบกับ \ r \ n C # มี Environment.NewLine เพื่อวัตถุประสงค์เดียวกัน
Jordan Running

Java มีบางอย่างในระบบเช่นกัน แต่% n นั้นง่ายกว่าใน printf
Paul Tomblin

เหตุใด java จึงเปลี่ยนรูปแบบ c นี้ == +1, :)
Michael Dimmitt

ไม่ใช่การเปลี่ยนแปลงการเพิ่มเติม / การปรับปรุง \ n ยังคงหมายถึง \ n
Bill K

(หมายเหตุสำหรับผู้อ่านในอนาคต: C แปลง\nเป็นบรรทัดใหม่เฉพาะแพลตฟอร์มในรูปแบบข้อความโดยอัตโนมัติดูสิ่งนี้ Java ไม่ได้)
user202729

คำตอบ:


150

จาก Google ฉบับย่อ:

นอกจากนี้ยังมีตัวระบุหนึ่งตัวที่ไม่สอดคล้องกับอาร์กิวเมนต์ มันคือ "% n" ซึ่งแสดงการแบ่งบรรทัด นอกจากนี้ยังสามารถใช้ "\ n" ได้ในบางกรณี แต่เนื่องจาก "% n" จะแสดงผลตัวคั่นบรรทัดเฉพาะแพลตฟอร์มที่ถูกต้องเสมอจึงสามารถพกพาข้ามแพลตฟอร์มได้ในขณะที่ "\ n" ไม่ใช่

โปรดดู https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

แหล่งต้นฉบับ


@ user2864740 ที่จริงก็ไม่ได้ผลลัพธ์ที่ถูกต้องคั่นบรรทัดเฉพาะแพลตฟอร์ม แต่ปัจจุบันหนึ่ง
Hauke ​​Ingmar Schmidt

อืมนั่นหมายความว่าอย่างไร?
Kalpesh Soni

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


24

แม้ว่า\nจะเป็นอักขระขึ้นบรรทัดใหม่ที่ถูกต้องสำหรับระบบที่ใช้ Unix แต่ระบบอื่น ๆ อาจใช้อักขระที่แตกต่างกันเพื่อแสดงจุดสิ้นสุดของบรรทัด โดยเฉพาะอย่างยิ่งการใช้งานระบบปฏิบัติการ Windows \r\nและระบบ MacOS \rต้นใช้

เมื่อใช้%nในสตริงรูปแบบของคุณคุณจะบอกให้ Java ใช้ค่าที่ส่งคืนโดยSystem.getProperty("line.separator")ซึ่งเป็นตัวคั่นบรรทัดสำหรับระบบปัจจุบัน


18

คำเตือน:

หากคุณกำลังทำโค้ด NETWORKING คุณอาจต้องการความแน่นอน\nมากกว่า%nซึ่งอาจส่งอักขระที่แตกต่างกันไปทั่วเครือข่ายทั้งนี้ขึ้นอยู่กับแพลตฟอร์มที่ทำงานอยู่


8

"ถูกต้อง" ขึ้นอยู่กับสิ่งที่คุณกำลังพยายามทำ

\ n จะให้การสิ้นสุดบรรทัด "สไตล์ยูนิกซ์" แก่คุณเสมอ \ r \ n จะให้คำลงท้ายบรรทัด "dos style" เสมอ % n จะให้บรรทัดสิ้นสุดสำหรับแพลตฟอร์มที่คุณใช้งานอยู่

C จัดการสิ่งนี้แตกต่างกัน คุณสามารถเลือกเปิดไฟล์ในโหมด "ข้อความ" หรือ "ไบนารี" ก็ได้ หากคุณเปิดไฟล์ในโหมดไบนารี \ n จะให้การสิ้นสุดบรรทัด "สไตล์ยูนิกซ์" และ "\ r \ n" จะให้การสิ้นสุดบรรทัด "สไตล์ dos" หากคุณเปิดไฟล์ในโหมด "text" บนระบบ dos / windows เมื่อคุณเขียน \ n โค้ดจัดการไฟล์จะแปลงเป็น \ r \ n ดังนั้นการเปิดไฟล์ในโหมดข้อความและใช้ \ n คุณจะได้รับการสิ้นสุดบรรทัดเฉพาะของแพลตฟอร์ม

ฉันเห็นว่าทำไมนักออกแบบของ java จึงไม่ต้องการเลียนแบบแนวคิดแฮ็คของ C เกี่ยวกับโหมดไฟล์ "ข้อความ" และ "ไบนารี"


4

ใน java ให้\nสร้าง\u000Aอักขระ linefeed เสมอ %nจะได้รับการแยกสายที่ถูกต้องสำหรับการใช้งานแพลตฟอร์มโดยเฉพาะอย่างยิ่ง

ดังนั้นใช้\nเมื่อคุณแน่ใจว่าคุณต้องการ\u000Aตัวป้อนบรรทัดเช่นในระบบเครือข่าย
ในสถานการณ์อื่น ๆ ให้ใช้%n


4

สังเกตว่าคำตอบเหล่านี้เป็นจริงเมื่อใช้System.out.printf()หรือSystem.out.format()หรือFormatterวัตถุเท่านั้น ถ้าคุณใช้%nในSystem.out.println()มันก็จะผลิต%nไม่ขึ้นบรรทัดใหม่


0

ตัวระบุรูปแบบ% n เป็นตัวคั่นบรรทัดที่พกพาได้ในระบบปฏิบัติการ อย่างไรก็ตามไม่สามารถใช้เป็นอาร์กิวเมนต์สำหรับฟังก์ชัน System.out.print หรือ System.out.println

ขอแนะนำให้ใช้ตัวคั่นบรรทัดเวอร์ชันใหม่ด้านบนนี้เสมอ \ n

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