Có gì với "% n" của Java trong printf?


107

Tôi đang đọc Java hiệu quả và nó sử dụng %ncho ký tự dòng mới ở mọi nơi. Tôi đã sử dụng \nkhá thành công cho dòng mới trong các chương trình Java.

Cái nào là 'đúng'? Có chuyện gì vậy \n? Tại sao Java lại thay đổi quy ước C này?


1
Chỉ là phỏng đoán, nhưng: Hỗ trợ đa nền tảng. Các hệ thống khác nhau sử dụng các ký tự khác nhau cho các dòng mới, ví dụ \ n so với \ r \ n. C # có Environment.NewLine cho cùng mục đích.
Jordan Running

Java cũng có một cái gì đó trong Hệ thống, nhưng% n dễ dàng hơn trong một printf.
Paul Tomblin

tại sao java thay đổi ước này c == +1, :)
Michael dimmitt

Không phải là một thay đổi, một bổ sung / nâng cao. \ n vẫn có nghĩa là \ n
Bill K

(lưu ý với độc giả trong tương lai: C đã tự động chuyển đổi \nsang dòng mới dành riêng cho nền tảng cụ thể ở định dạng văn bản, hãy xem điều này , Java thì không)
user202729

Câu trả lời:


150

Từ một google nhanh:

Ngoài ra còn có một chỉ định không tương ứng với một đối số. Nó là "% n" cho ra ngắt dòng. "\ N" cũng có thể được sử dụng trong một số trường hợp, nhưng vì "% n" luôn xuất ra đúng dấu phân tách dòng dành riêng cho nền tảng, nên nó có thể di động trên các nền tảng trong khi "\ n" thì không.

Vui lòng tham khảo https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Nguồn chính thức


@ user2864740 Đúng vậy, nó không xuất ra đúng dấu phân tách dòng dành riêng cho nền tảng mà là dấu hiện tại .
Hauke ​​Ingmar Schmidt

umm, điều đó có nghĩa là gì?
Kalpesh Soni

Tôi tin rằng nó sử dụng một cái cho hệ điều hành hiện tại mà nó đang chạy, nhưng nếu nó đang chạy trên Linux và xuất mã cho windows thì nó có thể không giống như bạn đang theo đuổi. Tôi không chắc chắn những gì hai người bình luận khác có thể đã đề cập đến.
Bill K


24

Mặc dù \nlà ký tự dòng mới chính xác cho các hệ thống dựa trên Unix, các hệ thống khác có thể sử dụng các ký tự khác nhau để biểu thị phần cuối của một dòng. Đặc biệt, sử dụng hệ thống Windows \r\nvà hệ thống MacOS đầu tiên được sử dụng \r.

Bằng cách sử dụng %ntrong chuỗi định dạng của bạn, bạn yêu cầu Java sử dụng giá trị được trả về System.getProperty("line.separator"), là dấu phân cách dòng cho hệ thống hiện tại.


18

Cảnh báo:

Nếu bạn đang thực hiện mã NETWORKING, bạn có thể thích sự chắc chắn hơn \n, thay vì %nnó có thể gửi các ký tự khác nhau trên mạng, tùy thuộc vào nền tảng mà nó đang chạy.


8

"đúng" phụ thuộc vào chính xác những gì bạn đang cố gắng thực hiện.

\ n sẽ luôn cung cấp cho bạn kết thúc dòng "kiểu unix". \ r \ n sẽ luôn cung cấp cho bạn kết thúc dòng "phong cách dos". % n sẽ cung cấp cho bạn dòng kết thúc cho nền tảng bạn đang chạy

C xử lý điều này theo cách khác. Bạn có thể chọn mở tệp ở chế độ "văn bản" hoặc "nhị phân". Nếu bạn mở tệp ở chế độ nhị phân \ n sẽ cung cấp cho bạn kết thúc dòng "kiểu unix" và "\ r \ n" sẽ cung cấp cho bạn kết thúc dòng "kiểu dos". Nếu bạn mở tệp ở chế độ "văn bản" trên hệ thống dos / windows thì khi bạn viết \ n, mã xử lý tệp sẽ chuyển nó thành \ r \ n. Vì vậy, bằng cách mở tệp ở chế độ văn bản và sử dụng \ n, bạn sẽ nhận được phần cuối của dòng dành riêng cho nền tảng.

Tôi có thể hiểu tại sao các nhà thiết kế của java không muốn sao chép những ý tưởng hacky của C về chế độ tệp "văn bản" và "nhị phân".


4

Trong java, \nluôn tạo \u000Aký tự dòng cấp dữ liệu. Để có được dấu phân cách dòng chính xác cho việc sử dụng nền tảng cụ thể %n.

Vì vậy, hãy sử dụng \nkhi bạn chắc chắn rằng bạn cần \u000Anhân vật trong nguồn cấp dữ liệu, chẳng hạn như trong mạng.
Trong tất cả các tình huống khác, sử dụng%n


4

Chú ý đến những câu trả lời là chỉ đúng khi sử dụng System.out.printf()hoặc System.out.format()hoặc các Formatterđối tượng. Nếu bạn sử dụng %ntrong System.out.println(), nó sẽ chỉ tạo ra %nmột dòng chứ không phải dòng mới.


0

% n format specifier là một dấu phân cách dòng có thể di động trên các hệ điều hành. Tuy nhiên, nó không thể được sử dụng làm đối số cho các hàm System.out.print hoặc System.out.println.

Bạn luôn nên sử dụng phiên bản mới của dấu phân tách dòng ở trên \ n.

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.