Làm cách nào để có được một ký tự dòng mới phụ thuộc vào nền tảng?


542

Làm cách nào để có được một dòng mới phụ thuộc vào nền tảng trong Java? Tôi không thể sử dụng "\n"ở mọi nơi.


Hãy xem xét thay đổi các câu trả lời được chấp nhận. Câu trả lời thứ 2 là phù hợp hơn.
Xám

Câu trả lời:


364

Ngoài thuộc tính line.separator, nếu bạn đang sử dụng java 1.5 trở lên và String.format (hoặc các phương thức định dạng khác), bạn có thể sử dụng %nnhư trong

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   ^^

Xem API Java 1.8 cho Trình định dạng để biết thêm chi tiết.


7
Cảm ơn bạn! Tôi chắc chắn System.getProperty ("line.separator"); có những công dụng của nó, nhưng tôi cảm thấy mệt mỏi khi thấy: "Dòng 1" + System.getProperty ("line.separator") + "Line 2"
Nút840

43
Ôi, "Dòng 1" + System.getProperty ("line.separator") + "Line 2" thực sự là một trong những điều xấu nhất tôi từng thấy. Chỉ cần tuyên bố một hằng số ở nơi khác sẽ ít đau đớn hơn.
abahgat

4
ít nhất nó không hoạt động với một chuỗi đi vào câu lệnh log4j. Tạo một ví dụ với một dòng mới ở cuối có khả năng che giấu vấn đề. Ngoài ra, Chuỗi s2 chỉ gây nhầm lẫn khi sử dụng '%% n'
Rabbi tàng hình

6
Đừng sử dụng điều này nếu chuỗi của bạn có thể chứa %từ đầu vào của người dùng!
Konstantin Weitz

8
@Konstantinweitz, vấn đề của String.format(s + "%n")dễ dàng được giải quyết bằng String.format("%s%n", s). Sẽ luôn có rủi ro khi liên quan đến đầu vào của người dùng dưới dạng cơ thể định dạng (theo cùng một cách eval()).
Franklin Yu

710

Java 7 bây giờ có một System.lineSeparator()phương thức.


8
Sẽ rất tuyệt nếu họ cung cấp một phương thức quá tải lineSeperator(int), trả về một số số bộ tách dòng, vì tôi thường thấy mình sử dụng 2 cái cùng một lúc.
Kon

10
@Kon Dựa trên câu trả lời này :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Với Java 11:System.lineSeparator().repeat(5)
Jacob G.

4
@JacobG Ngừng hả hê .. một số người trong chúng ta vẫn bị mắc kẹt trên Java 7.
Andrew T Finnell

@AndrewTFinnell Tôi sẽ tìm được một công việc tốt hơn <:-P Không có container -> không có Java 11, vì vậy bạn đang ở để có mức lương tốt hơn, chúng tôi có thể hả hê :-D
Aubergine

650

Bạn có thể dùng

System.getProperty("line.separator");

để có được dấu phân cách dòng


4
Muốn thêm System.lineSeparator()chi tiết Java 7 vậy đây là câu trả lời dứt khoát cho câu hỏi này?
Xám

43

Nếu bạn đang cố gắng viết một dòng mới vào một tệp, bạn chỉ cần sử dụng phương thức newLine () của BufferedWriter .


31

Điều này cũng có thể : String.format("%n").

Hoặc String.format("%n").intern()để lưu một số byte.


7
Điều này giống như câu trả lời của Alex B.
Spoike

16
Oh bây giờ tôi thấy nó. Anh ấy đã viết rất nhiều thứ không có nội dung xung quanh câu trả lời của mình. ;-)
ceving

Tôi đã thử làm điều này nhưng khi tôi xem tệp trong notepad, nó không nhận ra dòng mới.
mr5

1
@ mr5 notepadkhông phải là công cụ phù hợp để xem nội dung của tệp. Sử dụng hexdumphoặc od.
ceving

@ceving Tôi đang ở trong môi trường Windows và tôi đã mong đợi dòng mới sẽ là sự kết hợp của\r\n
mr5

22

Các commons-lang thư viện có một trường liên tục có sẵn gọi là SystemUtils.LINE_SEPARATOR


19
Có, cài đặt thư viện bên thứ ba chỉ để có được dòng mới độc lập với nền tảng! #facepalm
Shervin Asgari

23
@Shervin tất nhiên bạn sẽ không làm điều đó, nhưng nhiều dự án tôi đã thực hiện đã sử dụng commons-lang và một số phiên bản Java cũ hơn. Vì vậy, nếu bạn tình cờ sử dụng commons-lang thì đây là một câu trả lời hợp lý. Tôi không cảm thấy cần phải chỉ ra rằng, tôi rõ ràng đã sai.
vựng

2
Đây thực sự là một gợi ý tốt cho các dự án đã sử dụng thư viện này, cảm ơn!
Alexis Leclerc

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

Đoạn mã trên sẽ có hai chuỗi được phân tách bằng một dòng mới không phân biệt nền tảng.


13

Nếu bạn đang ghi vào một tệp, sử dụng một BufferedWriterthể hiện, hãy sử dụng newLine()phương thức của thể hiện đó. Nó cung cấp một cách độc lập với nền tảng để viết dòng mới trong một tệp.


1
Câu trả lời này là một bản sao của Mike Meyers ' .
Búa búa Agi

-3

Tránh nối các chuỗi bằng String + String, v.v., thay vào đó hãy sử dụng 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
Điều này thực sự không thành vấn đề trong hầu hết các trường hợp, Jeff Atwood của Coding H khiếp sợ đã viết một bài đăng trên blog về loại tối ưu hóa vi mô đặc biệt này . Luôn luôn làm số liệu trước khi đưa ra yêu cầu, chẳng hạn như "không làm string + string".
Spoike

6
Tôi muốn nói rằng bài viết của Jeff có thể hơi lạc hậu vì nó chỉ chạm vào thời gian thực hiện. Nối chuỗi trong Java không chỉ về tốc độ thực thi mà còn cả lượng rác bạn để lại trong bộ nhớ để dọn dẹp, điều này có thể dẫn đến việc GC chạy thường xuyên hơn. Điều này có thể hoặc không thể là một vấn đề tùy thuộc vào môi trường và cấu hình của bạn.
Lajcik

7
Lajcik, tôi nghi ngờ đó là tối ưu hóa trước cho tất cả các trường hợp ngoại trừ những người thực sự thực hiện nhiều thao tác chuỗi. StringBuffer là một mô hình chống cho các yêu cầu ghép nối nhỏ. Trong nhiều trường hợp, tôi muốn có String1 + separator + String2 dễ đọc hơn ví dụ đa dòng đã nói ở trên. Ngoài ra, tôi khuyên bạn nên kiểm tra xem bộ nhớ & GC có bị ảnh hưởng tích cực hay không bằng cách thêm SB. Trong nhiều trường hợp, tôi đoán là không. Nếu nó không đáng để thử nghiệm, có lẽ nó sẽ tối ưu hóa trước và tôi tập trung vào khả năng đọc.
Richard Watson

31
Thực hiện String1 + String2 cũng giống như thực hiện StringBuilder (String1) .append (String2) mới trong các trình biên dịch hiện đại, do đó không có sự tối ưu hóa nào cho một concat chuỗi lót. StringBuilder chỉ có giá trị trong các vòng lặp hoặc các phương thức đệ quy. Nhưng dù sao, điều này có thể nằm ngoài phạm vi của câu hỏi ban đầu.
user327961

@ user327961: chuyện có thật. Người ta có thể dễ dàng chứng minh điều này bằng cách sử dụng IDE yêu thích của bạn và trình gỡ lỗi.
Điều trị
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.