Ada apa dengan “% n” Java di printf?

107

Saya membaca Java Efektif dan menggunakan %nkarakter baris baru di mana-mana. Saya telah menggunakan \ncukup berhasil untuk baris baru dalam program Java.

Mana yang 'benar'? Ada apa dengan \n? Mengapa Java mengubah konvensi C ini?

ripper234
sumber
1
Hanya menebak, tapi: Dukungan lintas platform. Sistem yang berbeda menggunakan karakter yang berbeda untuk baris baru, misalnya \ n vs. \ r \ n. C # memiliki Environment.NewLine untuk tujuan yang sama.
Jordan Tayang
Java memiliki sesuatu di Sistem juga, tapi% n lebih mudah di printf.
Paul Tomblin
mengapa java mengubah konvensi c ini == +1, :)
Michael Dimmitt
Bukan perubahan, penambahan / peningkatan. \ n masih berarti \ n
Bill K
(catatan untuk pembaca mendatang: C sudah otomatis mengkonversi \nke baris baru khusus platform dalam format teks, lihat ini , Java tidak)
user202729

Jawaban:

150

Dari google cepat:

Ada juga satu penentu yang tidak sesuai dengan argumen. Ini adalah "% n" yang mengeluarkan jeda baris. "\ N" juga dapat digunakan dalam beberapa kasus, tetapi karena "% n" selalu mengeluarkan pemisah baris khusus platform yang benar, ini portabel di seluruh platform sedangkan "\ n" tidak.

Silakan lihat https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Sumber asli

Bill K
sumber
@ user2864740 Itu benar, itu tidak menampilkan pemisah baris khusus platform yang benar tetapi yang sekarang .
Hauke ​​Ingmar Schmidt
umm, apa maksudnya itu?
Kalpesh Soni
Saya percaya itu menggunakan satu untuk OS saat ini yang dijalankannya, tetapi jika itu berjalan di Linux dan mengeluarkan kode untuk windows, itu mungkin bukan yang Anda cari. Saya tidak yakin apa yang dirujuk oleh dua komentator lainnya.
Bill K
24

Meskipun \nmerupakan karakter baris baru yang benar untuk sistem berbasis Unix, sistem lain mungkin menggunakan karakter berbeda untuk mewakili akhir baris. Secara khusus, penggunaan sistem Windows \r\n, dan sistem MacOS awal digunakan \r.

Dengan menggunakan %ndalam format string Anda, Anda memberi tahu Java untuk menggunakan nilai yang dikembalikan oleh System.getProperty("line.separator"), yang merupakan pemisah garis untuk sistem saat ini.

Craig Putnam
sumber
18

Peringatan:

Jika Anda melakukan kode NETWORKING, Anda mungkin lebih memilih kepastian \n, daripada %nmengirim karakter yang berbeda ke seluruh jaringan, tergantung pada platform apa yang dijalankan.

George Forman
sumber
8

"benar" tergantung pada apa yang sebenarnya Anda coba lakukan.

\ n akan selalu memberi Anda akhiran baris "gaya unix". \ r \ n akan selalu memberi Anda akhiran baris "gaya dos". % n akan memberi Anda akhiran baris untuk platform yang Anda jalankan

C menangani ini secara berbeda. Anda dapat memilih untuk membuka file dalam mode "teks" atau "biner". Jika Anda membuka file dalam mode biner \ n akan memberi Anda akhiran baris "gaya unix" dan "\ r \ n" akan memberi Anda akhiran baris "gaya dos". Jika Anda membuka file dalam mode "teks" pada sistem dos / windows maka ketika Anda menulis \ n kode penanganan file mengubahnya menjadi \ r \ n. Jadi dengan membuka file dalam mode teks dan menggunakan \ n Anda mendapatkan akhiran baris khusus platform.

Saya dapat melihat mengapa desainer java tidak ingin meniru ide hacky C tentang mode file "teks" dan "biner".

Peter Green
sumber
4

Di java, \nselalu buat \u000Akarakter linefeed. Untuk mendapatkan pemisah garis yang benar untuk penggunaan platform tertentu %n.

Jadi gunakan \nketika Anda yakin bahwa Anda membutuhkan \u000Akarakter linefeed, misalnya di jaringan.
Dalam semua situasi lain, gunakan%n

Fathah Rehman P.
sumber
4

Perhatikan bahwa jawaban ini hanya benar saat menggunakan System.out.printf()atau System.out.format()atau Formatterobjeknya. Jika Anda menggunakan %ndi System.out.println(), itu hanya akan menghasilkan %n, bukan baris baru.

pengguna1677663
sumber
0

% n penentu format adalah pemisah garis yang portabel di seluruh sistem operasi. Namun, ini tidak dapat digunakan sebagai argumen untuk fungsi System.out.print atau System.out.println.

Selalu disarankan untuk menggunakan versi baru pemisah garis di atas \ n.

Piyush Patel
sumber