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


107

私は効果的なJavaを読んでい%nて、どこでも改行文字に使用されています。私は\nJavaプログラムの改行にかなりうまく使いました。

「正しい」ものはどれですか?何が問題になってい\nますか?JavaがこのCの規則を変更したのはなぜですか?


1
推測だけですが、クロスプラットフォームのサポートです。\ nと\ r \ nのように、システムによって、改行に使用する文字が異なります。C#にも同じ目的でEnvironment.NewLineがあります。
ジョーダン、

Javaにもシステムに何かがありますが、printnでは%nの方が簡単です。
ポールトンブリン

javaがこのcの規則を変更した理由== +1、:)
Michael

変更ではなく、追加/拡張。\ nまだ意味します\ n
ビルK

(将来の読者への注意:Cは既に\nテキスト形式でプラットフォーム固有の改行に自動変換されます。これは参照してください。Javaはそうではありません)
user202729

回答:


150

簡単なグーグルから:

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

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

元のソース


@ user2864740そのとおり、プラットフォーム固有の正しい行区切り文字は出力されませんが、現在の行区切り文字は出力されます
Hauke Ingmar Schmidt

うーん、それはどういう意味ですか?
Kalpesh Soni

私はそれが実行されている現在のOS用のものを使用していると思いますが、それがLinuxで実行されていて、Windows用のコードを出力している場合は、あなたが求めているものとは異なるかもしれません。他の2人のコメンターが何を参照していたのか、他の点ではわかりません。
ビルK


24

一方で\nUnixベースのシステムの正しい改行文字で、他のシステムは、行の終わりを表すために別の文字を使用することができます。特に、Windowsシステムの使用\r\n、および初期のMacOSシステムの使用\r

使用することにより%n、あなたのフォーマット文字列で、あなたはによって返された値を使用するには、Javaを教えSystem.getProperty("line.separator")、現在のシステムのための行区切りで、。


18

警告:

NETWORKINGコードを実行\nして%nいる場合は、実行しているプラ​​ットフォームに応じて、ネットワークを介して異なる文字を送信するのではなく、の確実性を優先できます。


8

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

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

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

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


4

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

したがって、ネットワークなどでラインフィード文字\nが必要なことが確実な場合に使用してください\u000A
他のすべての状況で使用%n


4

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.