プラットフォーム依存の改行文字を取得するにはどうすればよいですか?


542

Javaでプラットフォーム依存の改行を取得するにはどうすればよいですか?"\n"どこでも使えない。


受け入れられた回答を変更することを検討してください。2番目の答えがより適切です。
グレー

回答:


364

line.separatorプロパティに加えて、Java 1.5以降とString.format(または他のフォーマットメソッド)を使用し%nている場合は、次のように使用できます。

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

詳細については、フォーマッタ用のJava 1.8 APIを参照してください。


7
ありがとうございました!きっとSystem.getProperty( "line.separator"); その用途がありますが、私は見るのにうんざりしています: "Line 1" + System.getProperty( "line.separator")+ "Line 2"
Buttons840

43
ああ、 "Line 1" + System.getProperty( "line.separator")+ "Line 2"は、私が今まで見た中で最も醜いものの1つです。他の場所で定数を宣言するだけで、それほど苦痛はありません。
アバガット

4
これは、少なくとも、log4jステートメントに文字列が入る場合は機能しません。最後に改行を含む例を作成すると、問題が隠れてしまう可能性があります。また、文字列s2は '%% n'を使用して混乱しています
Stealth Rabbi

6
文字列に%ユーザー入力が含まれている可能性がある場合は、これを使用しないでください。
Konstantin Weitz 2013年

8
@KonstantinWeitz、の問題はString.format(s + "%n")によって簡単に解決されString.format("%s%n", s)ます。(と同じようにeval())フォーマット入力としてユーザー入力を含めることは常に危険です。
フランクリンユー

710

Java 7にSystem.lineSeparator()メソッドが追加されました。


8
lineSeperator(int)私はしばしば2を一度に使用しているので、いくつかの行区切り文字を返すオーバーロードメソッドを提供することは非常に良いでしょう。
2016年

10
@Kon この回答に基づく:String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Java 11の場合:System.lineSeparator().repeat(5)
ジェイコブ

4
@JacobG停止は...私たちの一部はまだJavaの7に貼付されてほくそ笑ん
アンドリュー・T Finnell

私はより良い仕事<:-Pなしコンテナ- >見つけるだろう@AndrewTFinnellなしJavaの11を、あなたはより良い給料のために滞在しているので、我々は:-Dほくそ笑むことができます
ナス

650

使用できます

System.getProperty("line.separator");

行区切りを取得する


4
Java 7のSystem.lineSeparator()詳細を追加することに注意してください。ここに、この質問に対する決定的な答えがありますか?
グレー


31

これも可能ですString.format("%n")

またはString.format("%n").intern()、いくつかのバイトを節約します。


7
これはアレックスBの答えと同じです。
スポーク2013

16
ああ、私はそれを見る。彼は彼の答えの周りに非常に多くの質問されていないものを書いた。;-)
2013

これを試しましたが、メモ帳でファイルを表示すると、改行が認識されません。
mr5 2015年

1
@ mr5 notepadは、ファイルの内容を表示するための適切なツールではありません。hexdumpまたはを使用しodます。
15年

@ceing私がWindows環境にいて、改行が次の組み合わせになると予想していました\r\n
mr5

22

コモンズ・ラングのライブラリが利用可能と呼ばれる一定のフィールドがあるSystemUtils.LINE_SEPARATORを


19
はい、プラットフォームに依存しない新しいラインを得るためだけにサードパーティのライブラリをインストールしてください!#facepalm
シェルビン

23
@Shervinもちろんそうはしませんが、私が取り組んだ多くのプロジェクトはすでにcommons-langといくつかの古いバージョンのJavaを使用しています。したがって、すでにcommons-langを使用している場合、これは賢明な答えです。私はそれを指摘する必要はないと感じました、私は明らかに間違っていました。
レキシカルスコープ、2014年

2
これは確かに、すでにこのライブラリを使用しているプロジェクトに良い提案です、ありがとう!
Alexis Leclerc 2014年

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

上記のスニペットには、プラットフォームに関係なく、2つの文字列が改行で区切られます。


13

BufferedWriterインスタンスを使用してファイルに書き込む場合はnewLine()、そのインスタンスのメソッドを使用します。ファイルに新しい行を書き込むためのプラットフォームに依存しない方法を提供します。



-3

String + Stringなどを使用して文字列を追加することは避け、代わりにStringBuilderを使用してください。

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
これは実際にはほとんど問題ではありません。CodingHorrorのJeff Atwoodがこの特定の種類のマイクロ最適化についてブログに投稿しました。「しないでくださいstring + string」などの主張をする前に、必ずメトリックを実行してください。
スポイケ

6
ジェフの記事は実行時間にのみ触れているため、少しずれているかもしれません。Javaでの文字列連結は、実行速度だけでなく、GCがクリーンアップするためにメモリに残しておくガベージの量にも関係します。これにより、GCがより頻繁に実行される可能性があります。これは、環境や構成によっては問題になる場合とそうでない場合があります。
Lajcik

7
Lajcik、それは本当に多くの文字列操作を行う人を除いて、すべてのケースで事前最適化だと思います。StringBufferは、小さな連結要件に対するアンチパターンです。多くの場合、上記の複数行の例よりも、読みやすいString1 +セパレータ+ String2が必要です。さらに、SBを追加することで、メモリとGCに良い影響があるかどうかをテストすることをお勧めします。多くの場合、そうではないと思います。テストする価値がない場合は、おそらく事前最適化であり、読みやすさに重点を置いています。
Richard Watson

31
String1 + String2を実行することは、最近のコンパイラで新しいStringBuilder(String1).append(String2)を実行することと同じであるため、1つのライナー文字列連結の最適化はまったくありません。StringBuilderは一般に、ループまたは再帰的なメソッドでのみ価値があります。しかし、とにかく、これは元の質問の範囲外である可能性があります。
user327961 2013年

@ user327961:実話。お気に入りのIDEとデバッガーを使用して、これを簡単に証明できます。
2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.