O co chodzi z „% n” Javy w printf?

107

Czytam Efektywną Javę i %nwszędzie używa ona znaku nowej linii. Używałem \nraczej z powodzeniem dla nowej linii w programach Java.

Która z nich jest „właściwa”? Co jest nie tak \n? Dlaczego Java zmieniła tę konwencję C?

zrywak234
źródło
1
Zgaduję, ale: Obsługa wielu platform. Różne systemy używają różnych znaków dla nowej linii, np. \ N kontra \ r \ n. C # ma Environment.NewLine w tym samym celu.
Jordan działa
Java również ma coś w Systemie, ale% n jest łatwiejsze w printf.
Paul Tomblin
dlaczego java zmienił tę konwencję c == +1, :)
Michael Dimmitt
Nie zmiana, dodatek / ulepszenie. \ n nadal oznacza \ n
Bill K
(uwaga dla przyszłych czytelników: C już automatycznie konwertuje \ndo nowej linii specyficznej dla platformy w formacie tekstowym, zobacz to , Java nie)
user202729

Odpowiedzi:

150

Z szybkiego google:

Istnieje również jeden specyfikator, który nie odpowiada argumentowi. To „% n” generuje przerwanie linii. W niektórych przypadkach można również użyć znaku "\ n", ale ponieważ "% n" zawsze wyświetla poprawny separator linii specyficzny dla platformy, można go przenosić między platformami, podczas gdy "\ n" nie.

Proszę zapoznać się z https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Pierwotnym źródłem

Bill K.
źródło
@ user2864740 To prawda, nie wyświetla poprawnego separatora wiersza specyficznego dla platformy, ale bieżący .
Hauke ​​Ingmar Schmidt
umm, co to znaczy?
Kalpesh Soni
Uważam, że używa tego dla bieżącego systemu operacyjnego, na którym działa, ale jeśli działa w systemie Linux i generuje kod dla systemu Windows, może nie być tym, czego szukasz. W przeciwnym razie nie jestem pewien, do czego mogli się odnosić pozostali dwaj komentatorzy.
Bill K
24

Chociaż \njest to poprawny znak nowej linii dla systemów uniksowych, inne systemy mogą używać innych znaków do reprezentowania końca linii. W szczególności wykorzystanie systemu Windows \r\ni wczesne systemy MacOS \r.

Używając %nw swoim ciągu formatu, mówisz Javie, aby używała wartości zwróconej przez System.getProperty("line.separator"), która jest separatorem linii dla bieżącego systemu.

Craig Putnam
źródło
18

Ostrzeżenie:

Jeśli tworzysz kod NETWORKING, możesz preferować pewność \n, w przeciwieństwie do tego, %nktóry może wysyłać różne znaki przez sieć, w zależności od platformy, na której działa.

George Forman
źródło
8

„poprawność” zależy od tego, co dokładnie próbujesz zrobić.

\ n zawsze da ci zakończenie linii "w stylu unixowym". \ r \ n zawsze daje zakończenie linii w stylu „dos style”. % n poda zakończenie linii dla platformy, na której pracujesz

C radzi sobie z tym inaczej. Możesz wybrać otwarcie pliku w trybie „tekstowym” lub „binarnym”. Jeśli otworzysz plik w trybie binarnym, \ n da ci zakończenie linii w stylu "unixowym", a "\ r \ n" da ci zakończenie linii w stylu "dos style". Jeśli otworzysz plik w trybie "tekstowym" w systemie DOS / Windows, to podczas pisania \ n kod obsługi pliku konwertuje go na \ r \ n. Otwierając plik w trybie tekstowym i używając \ n, otrzymujesz zakończenie wiersza specyficzne dla platformy.

Rozumiem, dlaczego projektanci javy nie chcieli powielać hakerskich pomysłów C dotyczących trybów plików "tekstowy" i "binarny".

Peter Green
źródło
4

W Javie \nzawsze generuj \u000Aznak wysuwu wiersza. Aby uzyskać właściwy separator linii dla konkretnego zastosowania platformy %n.

Dlatego używaj, \ngdy jesteś pewien, że potrzebujesz \u000Aznaku wysuwu wiersza, na przykład w sieci.
We wszystkich innych sytuacjach użyj%n

Fathah Rehman P.
źródło
4

Zauważ, że te odpowiedzi są prawdziwe tylko wtedy, gdy używasz System.out.printf()or System.out.format()lub Formatterobiektu. Jeśli użyjesz %nw System.out.println(), po prostu wygeneruje znak %n, a nie znak nowej linii.

user1677663
źródło
0

Specyfikator formatu% n to separator linii, który można przenosić między systemami operacyjnymi. Nie można go jednak używać jako argumentu funkcji System.out.print lub System.out.println.

Zawsze zaleca się używanie tej nowej wersji separatora linii powyżej \ n.

Piyush Patel
źródło