2009-12-10 25 views
72

我正在閱讀Effective Java,它在任何地方都使用%n作爲換行符。我已經使用\n而非Java程序中的新行。printf中Java的「%n」是什麼?

哪一個是「正確」的? \n有什麼不對?爲什麼Java改變這個C約定?

+1

只是一個猜測,但:跨平臺支持。不同的系統對換行符使用不同的字符,例如, \ n與\ r \ n。 C#有Environment.NewLine出於同樣的目的。 –

+0

Java在系統中也有一些東西,但%n在printf中更容易。 –

+0

爲什麼java會更改這個c約定== +1,:) –

回答

107

從快速谷歌:

也有一個符不符合參數。它是輸出換行符的「%n」。在某些情況下也可以使用「\ n」,但由於「%n」總是輸出正確的特定於平臺的行分隔符,因此它跨平臺可移植,而「\ n」不是。

請參閱 https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Original source

+3

其中「正確的行分隔符」基於所使用的上下文在很大程度上是任意的。 – user2864740

+0

@ user2864740確實如此,它不會輸出_correct_平臺特定的行分隔符但是_current_之一。 –

19

雖然\n爲基於Unix的系統,其他系統的正確換行符可能使用不同的字符來表示一行的結尾。特別是,Windows系統使用\r\n,而早期的MacOS系統使用\r

通過在格式字符串中使用%n,你告訴Java使用由System.getProperty("line.separator")返回的值,這是當前系統的行分隔符。

13

警告:如果你正在做的網絡代碼,你可能更喜歡的\ n中的確定性,而不是爲%n可通過網絡發送不同的角色,這取決於什麼平臺運行它的。

7

「正確」取決於你正在嘗試做什麼。

\ n將永遠給你一個「UNIX風格」的行結束。 \ r \ n會一直給你一個「dos風格」的行結尾。 %的正會給你你正在運行的平臺結束行

Ç不同的方式處理這個。您可以選擇以「文本」或「二進制」模式打開文件。如果以二進制模式打開文件\ n會給你一個「unix style」行結尾,「\ r \ n」會給你一個「dos樣式」行結尾。如果您在dos/windows系統上以「文本」模式打開文件,那麼當您編寫\ n文件處理代碼時,它會將其轉換爲\ r \ n。因此,通過在文本模式下打開文件並使用\ n,您將獲得特定於平臺的行結束。

我明白爲什麼了Java的設計者並不希望複製C'S關於「文本」和「二進制」文件模式哈克的想法。

4

在java中,\n總是產生\u000A換行符。爲特定平臺使用%n獲得正確的行分隔符。

因此,如果您確定需要\u000A換行字符,例如在網絡中,請使用\n
在所有其他情況下使用%n

1

注意使用System.out.printf()System.out.format()Formatter對象時,這些答案是唯一的真實。如果您在System.out.println()中使用%n,則它只會產生一個%n,而不是換行符。

0

%n格式說明符是跨操作系統可移植的行分隔符。但是,它不能用作System.out.print或System.out.println函數的參數。

總是推薦在\ n以上使用這個新版本的分隔線。