web-dev-qa-db-ja.com

printfのJavaの「%n」はどうなっていますか?

Effective Javaを読んでおり、%nはどこでも改行文字を表します。利用した \nは、Javaプログラムの改行の場合はかなり正常です。

「正しい」ものはどれですか?どうしたの \n?なぜJavaこのC規約を変更したのですか?

94
ripper234

クイックグーグルから:

引数に対応しない指定子も1つあります。改行を出力するのは「%n」です。 「\ n」も使用できる場合がありますが、「%n」は常に正しいプラットフォーム固有の行区切り文字を出力するため、プラットフォーム間で移植可能ですが、「\ n」はそうではありません。

https://docs.Oracle.com/javase/tutorial/Java/data/numberformat.html を参照してください

元のソース

130
Bill K

%nはプラットフォーム間で移植可能\nは違います。

リファレンスドキュメントのフォーマット文字列構文 を参照してください:

'n'行区切り文字結果はプラットフォーム固有の行区切り文字です

27
Gregory Pakosz

_\n_はUnixベースのシステムの正しい改行文字ですが、他のシステムは行末を表すために異なる文字を使用する場合があります。特に、Windowsシステムは_\r\n_を使用し、初期のMacOSシステムは_\r_を使用しました。

書式文字列で_%n_を使用することにより、Java=現在のシステムの行区切り文字であるSystem.getProperty("line.separator")によって返される値を使用するように指示します。

23
Craig Putnam

警告:NETWORKINGコードを実行している場合、実行しているプラ​​ットフォームに応じて、ネットワーク経由で異なる文字を送信する可能性がある%nではなく、\ nの確実性を好む場合があります。

16
George Forman

「正しい」とは、あなたが何をしようとしているかによって異なります。

\ nは常に「Unixスタイル」の行末を提供します。\r\nは、常に「dosスタイル」の行末を提供します。 %nは、実行中のプラットフォームの行末を示します

Cはこれを異なる方法で処理します。 「テキスト」モードまたは「バイナリ」モードでファイルを開くことを選択できます。ファイルをバイナリモードで開くと、\ nは「unixスタイル」の行末を提供し、「\ r\n」は「dosスタイル」の行末を提供します。 dos/windowsシステムで「テキスト」モードでファイルを開いた場合、\ nを書き込むと、ファイル処理コードは\ r\nに変換します。そのため、ファイルをテキストモードで開き、\ nを使用すると、プラットフォーム固有の行末が取得されます。

Javaの設計者が、「テキスト」および「バイナリ」ファイルモードに関するCのハックなアイデアを再現したくなかった理由がわかります。

7
Peter Green

Javaでは、\nは常に\u000A改行文字を生成します。特定のプラットフォームの正しい行区切り文字を取得するには、%nを使用します。

したがって、ネットワークなどで\n改行文字が必要なことが確実な場合は、\u000Aを使用してください。
他のすべての状況では、%nを使用します

4
Fathah Rehman P

これらの答えは、System.out.printf()またはSystem.out.format()またはFormatterオブジェクトを使用する場合にのみ真であることに注意してください。 System.out.println()%nを使用すると、改行ではなく、単に%nが生成されます。

3
user1677663

%n形式指定子は、オペレーティングシステム間で移植可能な行区切り記号です。ただし、System.out.printまたはSystem.out.println関数の引数として使用することはできません。

\ nより上のこの新しいバージョンの行区切り記号を使用することを常にお勧めします。

0
Piyush P