Bagaimana cara mendapatkan karakter baris baru yang bergantung pada platform?

542

Bagaimana cara mendapatkan baris baru yang bergantung pada platform di Jawa? Saya tidak bisa menggunakannya di "\n"mana-mana.

Spoike
sumber
Harap pertimbangkan untuk mengubah jawaban yang diterima. Jawaban kedua lebih tepat.
Gray,

Jawaban:

364

Selain properti line.separator, jika Anda menggunakan java 1.5 atau lebih baru dan String.format (atau metode pemformatan lainnya ) Anda dapat menggunakan %nseperti di

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

Lihat Java 1.8 API untuk Formatter untuk lebih jelasnya.

Alex B
sumber
7
Terima kasih! Saya yakin System.getProperty ("line.separator"); memiliki kegunaannya, tapi saya bosan melihat: "Line 1" + System.getProperty ("line.separator") + "Line 2"
Buttons840
43
Oh my, "Line 1" + System.getProperty ("line.separator") + "Line 2" memang salah satu hal paling jelek yang pernah saya lihat. Dengan mendeklarasikan konstanta di tempat lain tidak akan terlalu menyakitkan.
abahgat
4
ini tidak bekerja, setidaknya, dengan string masuk ke pernyataan log4j. Membuat contoh dengan baris baru di bagian akhir berpotensi menyembunyikan masalahnya. Juga, String s2 hanya membingungkan menggunakan '%% n'
Stealth Rabbi
6
Jangan gunakan ini jika string Anda mungkin berisi %dari input pengguna!
Konstantin Weitz
8
@KonstantinWeitz, masalah String.format(s + "%n")mudah dipecahkan oleh String.format("%s%n", s). Itu selalu berisiko untuk melibatkan input pengguna sebagai format tubuh (dengan cara yang sama seperti eval()).
Franklin Yu
710

Java 7 sekarang memiliki System.lineSeparator()metode.

StriplingWarrior
sumber
8
Akan sangat baik dari mereka untuk menyediakan metode kelebihan beban lineSeperator(int)yang mengembalikan beberapa pemisah baris, karena saya sering menemukan diri saya menggunakan 2 sekaligus.
Kon
10
@Kon Berdasarkan jawaban ini :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer
4
Dengan Java 11:System.lineSeparator().repeat(5)
Jacob G.
4
@ Jacobs Stop gloating .. beberapa dari kita masih terjebak di Jawa 7.
Andrew T Finnell
@AndrewTFinnell Saya akan menemukan pekerjaan yang lebih baik <:-P Tidak ada wadah -> tidak ada Java 11, jadi Anda tinggal dengan gaji yang lebih baik, kita bisa menertawakan :-D
Aubergine
650

Kamu bisa menggunakan

System.getProperty("line.separator");

untuk mendapatkan pemisah garis

abahgat
sumber
4
Ingin menambahkan System.lineSeparator()detail Java 7 jadi di sini ada jawaban pasti untuk pertanyaan ini?
Gray,
43

Jika Anda mencoba menulis baris baru ke file, Anda bisa menggunakan metode BufferedWriter ()

Michael Myers
sumber
31

Hal ini juga mungkin: String.format("%n").

Atau String.format("%n").intern()untuk menyimpan beberapa byte.

ceving
sumber
7
Ini sama dengan jawaban Alex B.
Spoike
16
Oh sekarang aku melihatnya. Dia menulis begitu banyak hal tanpa jawaban di sekitar jawabannya. ;-)
ceving
Saya sudah mencoba melakukan ini tetapi ketika saya melihat file di notepad, itu tidak mengenali baris baru.
mr5
1
@ mr5 notepadbukan alat yang tepat untuk melihat konten file. Gunakan hexdumpatau od.
ceving
@ceving saya di lingkungan Windows dan saya mengharapkan baris baru akan menjadi kombinasi\r\n
mr5
22

The commons-lang perpustakaan memiliki medan konstan yang tersedia disebut SystemUtils.LINE_SEPARATOR

lingkup leksikal
sumber
19
Ya, pasang perpustakaan pihak ketiga hanya untuk mendapatkan platform baru yang independen! #facepalm
Shervin Asgari
23
@ Shervin tentu saja Anda tidak akan melakukan itu, tetapi banyak proyek yang telah saya kerjakan sudah menggunakan commons-lang dan beberapa versi Java yang lebih lama. Jadi jika Anda sudah menggunakan commons-lang maka ini adalah jawaban yang masuk akal. Saya tidak merasa perlu untuk menunjukkan itu, saya jelas salah.
lexicalscope
2
Ini memang saran yang bagus untuk proyek yang sudah menggunakan perpustakaan ini, terima kasih!
Alexis Leclerc
13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

Cuplikan di atas akan memiliki dua string yang dipisahkan oleh baris baru terlepas dari platform.

Sathesh Balakrishnan Manohar
sumber
13

Jika Anda menulis ke file, menggunakan BufferedWriterinstance, gunakan newLine()metode instance itu. Ini menyediakan cara bebas platform untuk menulis baris baru dalam file.

Damaji kalunge
sumber
1
Jawaban ini adalah duplikat dari Mike Meyers .
Agi Hammerthief
-3

Hindari menambahkan string menggunakan String + String dll, gunakan StringBuilder sebagai gantinya.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );
Gary Davies
sumber
20
Ini sebenarnya tidak masalah dalam banyak kasus, Coding Horror's Jeff Atwood membuat posting blog tentang semacam ini optimasi mikro . Selalu lakukan metrik sebelum membuat klaim seperti "jangan lakukan string + string".
Spoike
6
Saya akan mengatakan bahwa artikel Jeff mungkin sedikit bermasalah karena hanya menyentuh waktu eksekusi. Rangkaian string di Jawa tidak hanya tentang kecepatan eksekusi tetapi juga berapa banyak sampah yang Anda tinggalkan di memori agar GC dibersihkan, yang dapat menyebabkan GC berjalan lebih sering. Ini mungkin atau mungkin bukan masalah tergantung pada lingkungan dan konfigurasi Anda.
Lajcik
7
Lajcik, saya menduga itu pra-optimasi untuk semua kasus kecuali mereka yang benar-benar melakukan banyak manipulasi string. The StringBuffer adalah anti-pola untuk persyaratan gabungan kecil. Dalam banyak kasus saya lebih suka memiliki String1 + separator + String2 yang dapat dibaca daripada contoh multi-line yang disebutkan di atas. Selain itu, saya sarankan menguji apakah memori & GC dipengaruhi secara positif dengan menambahkan SB. Dalam banyak kasus saya kira itu bukan. Jika tidak layak untuk diuji, mungkin pra-optimalisasi dan saya akan fokus pada keterbacaan.
Richard Watson
31
Melakukan String1 + String2 sama dengan melakukan StringBuilder (String1) .append (String2) baru dalam kompiler modern, jadi tidak ada optimasi sama sekali untuk satu string string kapal. StringBuilder pada umumnya layak hanya dalam loop atau metode rekursif. Tapi bagaimanapun, ini mungkin di luar ruang lingkup pertanyaan aslinya.
user327961
@ user327961: kisah nyata. Orang dapat dengan mudah membuktikan ini menggunakan IDE dan debugger favorit Anda.
Atmocreations