1. はじめに
プログラミング言語の中でも、Javaは業務システムからAndroidアプリまで幅広く使われています。その中で「改行」を正しく扱うことは、出力結果の見やすさや可読性を高めるだけでなく、バグの防止や環境依存のトラブル回避にもつながる大切な知識です。
本記事では、Javaで改行を実現する基本的な方法から、実務でよく直面する「改行コードの違い」や「複数行リテラルの扱い」、そして初心者がつまずきやすいポイントまで、丁寧に解説します。また、Java 15以降で導入された新しい書き方(テキストブロック)も実例とともに紹介します。
さらに、記事の後半では、よくある質問や実際に開発現場で起こりやすいトラブルの対処法も取り上げます。Javaでの改行に迷った時、この記事が“最初に参考にすべき一冊”になることを目指して構成しています。
この後、Javaにおける改行の基本から順を追って解説していきますので、ぜひ最後までご覧ください。
2. Javaで改行するための基本方法
Javaで改行を表現する方法は複数ありますが、最も基本的でよく使われるのが「改行文字(\n)」と、標準出力メソッドの「System.out.println()」です。ここではそれぞれの使い方と違いについて解説します。
2.1 改行文字「\n」の使い方
Javaでは、文字列の中に「\n」(バックスラッシュ+エヌ)を挿入することで、任意の位置で改行を表現できます。例えば次のように記述します。
System.out.print("一行目\n二行目");
この場合、「一行目」と「二行目」が改行されて表示されます。
出力結果は次の通りです。
一行目
二行目
「\n」はUNIX系OS(LinuxやmacOSなど)で一般的に使われる改行コードですが、Windowsでは「\r\n」が使われるなど、環境によって違いがある点には注意が必要です。
2.2 System.out.println()とSystem.out.print()の違い
Javaでコンソールに文字を表示する際、よく使うのが「System.out.print()」と「System.out.println()」です。
この2つの違いをしっかり理解しておきましょう。
- System.out.print()
文字列をそのまま表示しますが、表示後に改行は入りません。
System.out.print("こんにちは");
System.out.print("世界");
出力結果:
こんにちは世界
- System.out.println()
文字列を表示したあと、自動的に改行されます。「ln」は“line”の略です。
System.out.println("こんにちは");
System.out.println("世界");
出力結果:
こんにちは
世界
また、「System.out.println()」は引数なしで使うと、単独で1行だけ改行することもできます。
System.out.println();
このように、Javaでは「\n」と「System.out.println()」をうまく使い分けることで、自由に改行を制御することができます。
3. OSごとの改行コード事情(Windows/UNIX/Mac)
Javaで改行を扱う際に注意したいのが、「改行コードがOSごとに異なる」という点です。普段はあまり意識しないかもしれませんが、ファイルへの書き込みや外部システムとの連携など、少し高度な開発を行う際に問題となることがあります。
3.1 各OSで使われる改行コード
改行コードとは、テキストデータ内で「ここから新しい行」という区切りを示すための特殊な文字列です。主なOSごとの改行コードは次の通りです。
- Windows:
\r\n
(キャリッジリターン+ラインフィード) - UNIX/Linux/macOS(現行):
\n
(ラインフィードのみ) - 古いMac OS(~OS9まで):
\r
(キャリッジリターンのみ)
3.2 なぜOSごとに違うのか
もともとコンピュータの黎明期に各社・各OSごとで改行の定義が異なっていたため、現在もこの違いが引き継がれています。
例えばWindowsは、タイプライターの動きを模して「キャリッジリターン(復帰)」+「ラインフィード(改行)」の2文字を採用しています。一方、UNIX系OSではシンプルに「\n」1文字で新しい行を表現しています。
3.3 Javaの「\n」はどうなる?
Javaプログラムで「\n」を使うと、多くの場合は問題なく改行されます。ですが、テキストファイルを外部のアプリケーション(メモ帳や他のOSのテキストエディタなど)で開くと、意図通りに表示されないことがあります。
特に、Windowsで「\n」だけを使ってテキストファイルを作成すると、メモ帳で行が繋がって表示されてしまうことがあります。
3.4 実務での注意点
- ファイル出力時や他OSとのデータ交換時は、改行コードに注意が必要です。
- 自分の環境では正常でも、相手側の環境でうまく改行されない場合があります。
- これを避けるためには、次章で解説する「環境依存を回避する方法」などを利用するのがおすすめです。
4. 環境依存を回避する方法
前章で解説した通り、OSによって改行コードが異なるため、Javaプログラムで出力する際に改行が意図通りに反映されないことがあります。特に、異なるOS間でテキストファイルをやり取りする場合や、チーム開発・システム連携の現場では、環境依存を避ける工夫が求められます。
4.1 System.getProperty("line.separator")
の活用
Javaでは、実行環境ごとに最適な改行コードを自動で取得できる仕組みが用意されています。それが System.getProperty("line.separator")
です。このメソッドを利用することで、プログラムを実行しているOSに適した改行コードを得ることができます。
例:
String lineSeparator = System.getProperty("line.separator");
System.out.print("1行目" + lineSeparator + "2行目");
このコードをWindowsで実行すれば「\r\n」、LinuxやmacOSなら「\n」が自動的に使われます。こうすることで、どんなOSでも正しく改行されるテキストを出力できます。
4.2 PrintWriter・BufferedWriterの改行メソッド
ファイルへの書き込み時など、PrintWriter
や BufferedWriter
の println()
メソッドを使う場合も、内部的にその環境に合った改行コードが利用されます。
PrintWriter pw = new PrintWriter("output.txt");
pw.println("これは1行目です。");
pw.println("これは2行目です。");
pw.close();
このように、改行処理をライブラリに任せるのも一つの方法です。
4.3 まとめ
- 文字列の中で手動で「\n」や「\r\n」を使うのは簡単ですが、移植性や再利用性を考えると
System.getProperty("line.separator")
や出力メソッドのprintln()
を活用するのが安全です。 - 特に、プログラムを異なるOSで動かす可能性がある場合は、環境依存しない方法を選びましょう。
5. Java 15〜 のテキストブロックによる複数行リテラル
Java 15からは、「テキストブロック(Text Blocks)」という新しい文字列リテラルが正式に導入されました。これにより、複数行にわたる文字列を、簡潔かつ見やすく記述できるようになりました。テキストブロックは、複数行のテキストやフォーマット済みの文字列を扱う際に非常に便利です。
5.1 テキストブロックの基本構文
テキストブロックは、3つのダブルクォーテーション(”””)で囲むことで表現します。
String text = """
これは1行目です。
これは2行目です。
これは3行目です。
""";
System.out.println(text);
このコードを実行すると、下記のように改行された状態で出力されます。
これは1行目です。
これは2行目です。
これは3行目です。
5.2 テキストブロックの特長と注意点
- インデント管理が容易
テキストブロックでは、先頭の共通インデントが自動的に除去されるため、コード全体の可読性が高まります。 - 改行をそのまま表現できる
通常の文字列リテラルのように「\n」を使わなくても、テキスト上の改行がそのまま出力に反映されます。 - 最終行の改行に注意
テキストブロックの最後に空行を入れると、その空行も出力に含まれるため、不要な場合は末尾に余計な空白や改行を入れないよう注意が必要です。
5.3 テキストブロックの応用例
JSONやSQL、HTMLなど、複数行にわたるフォーマット済みのテキストをソースコード内で定義したい場合にもテキストブロックは非常に有用です。
例:複数行のSQL文をテキストブロックで定義
String sql = """
SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY id DESC
""";
例:HTMLのテンプレート文字列として利用
String html = """
<html>
<body>
<h1>Hello, Java!</h1>
</body>
</html>
""";
5.4 まとめ
- テキストブロックを使うことで、複数行の文字列を直感的に、かつ見やすく記述できます。
- 改行やインデントがそのまま反映されるので、出力結果やファイル書き込み時のレイアウトが崩れにくくなります。
- Java 15以降の新機能なので、古いバージョンを使っている場合は利用できない点に注意しましょう。
6. 応用:Scannerでの入力と“改行消費”問題
Javaでユーザーから入力を受け付ける場合、標準入力としてよく利用されるのがScanner
クラスです。しかし、このScannerを使った入力処理で、初心者が最もつまずきやすいのが「改行の消費」問題です。
6.1 よくある問題例
例えば、数値入力と文字列入力を連続して行うと、意図しない動作になることがあります。
Scanner scanner = new Scanner(System.in);
System.out.print("年齢を入力してください:");
int age = scanner.nextInt();
System.out.print("名前を入力してください:");
String name = scanner.nextLine();
System.out.println("年齢:" + age + " 名前:" + name);
一見、問題なく動きそうですが、実際に実行してみると「名前を入力してください:」のところで、何も入力しなくても次に進んでしまいます。
6.2 なぜこうなるのか
これは、nextInt()
などの数値入力メソッドが、数値だけを読み取って「改行文字(Enter)」を消費しないことが原因です。そのため、次のnextLine()
がそのまま残っていた改行を受け取ってしまい、空文字列が入力されたことになってしまいます。

6.3 解決策
この問題を解消するには、数値入力後に残った改行を明示的に消費するため、nextLine()
を一度挟む必要があります。
修正例:
Scanner scanner = new Scanner(System.in);
System.out.print("年齢を入力してください:");
int age = scanner.nextInt();
scanner.nextLine(); // 改行を消費
System.out.print("名前を入力してください:");
String name = scanner.nextLine();
System.out.println("年齢:" + age + " 名前:" + name);
このように、数値入力(またはnext()
など)と文字列入力を連続して使う場合は、必ず間にnextLine()
を挟んで改行を消費するのが鉄則です。
6.4 まとめ
- Scannerを使った入力処理では、数値や単語入力のあとに文字列入力を続けると、改行が残って思わぬ動作になることがある。
nextLine()
で改行を明示的に消費することで、この問題は簡単に回避できる。- 入力処理を組み合わせる際は、改行の扱いに十分注意しましょう。
7. 改行制御のまとめとJava開発での実用Tips
ここまで、Javaで改行を制御するさまざまな方法を解説してきました。本章では、それぞれの特徴を整理し、実際の開発現場で役立つ使い分けやTipsをまとめます。
7.1 各改行方法の比較
方法 | 特徴 | 代表的な使い方 | 移植性 |
---|---|---|---|
\n | シンプル。文字列中で手軽に使える | "行1\n行2" | △(OS依存) |
System.out.println() | 標準出力時に改行を自動付与 | System.out.println("テキスト"); | ◎(OS自動) |
System.getProperty("line.separator") | 実行環境ごとに適切な改行コードを取得 | text + System.getProperty("line.separator") | ◎(OS適応) |
テキストブロック(Java15〜) | 複数行文字列をきれいに記述。インデントも管理可 | """複数行のテキスト""" | ◎ |
7.2 実用的な使い分け方
- 簡単な画面出力やログ表示:
System.out.println()
を活用。手軽に改行でき、可読性も高い。 - テキストをファイルに書き込むとき:
System.getProperty("line.separator")
を組み合わせて、どのOSでも正しく改行できるようにする。 - HTMLやSQLなど、複数行のリテラルを扱う場合:
Java 15以降ならテキストブロックが断然おすすめ。フォーマットを崩さず、見たまま記述できる。 - ユーザーからの入力処理:
Scanner利用時の「改行消費」問題に注意し、必ず必要に応じてnextLine()
で改行を消費する。
7.3 開発現場でよくある失敗パターン
- OSの違いを意識せず「\n」だけを使う
→ ファイルを他の環境で開くと、改行されていないように見える場合がある。 - Scannerの使い方で「空入力」になる
→ 数値や単語入力直後は必ず改行消費を挟む。 - 古いJavaバージョンでテキストブロックを使ってしまう
→ Java 15未満ではサポートされていないため、エラーになる。
7.4 Tipsまとめ
- 環境依存を避けたいときは
System.getProperty("line.separator")
か、出力系APIのprintln()
を積極的に使う。 - テキストブロックは、ドキュメント生成やコード埋め込みにも非常に便利。
- 実装時は、「誰が・どこで使うコードなのか」を意識して改行方法を選ぶのがポイント。
8. FAQ(よくある質問)
Javaで改行を扱う際、よく寄せられる疑問やトラブルについてまとめました。現場で実際によく遭遇するものを中心にQ&A形式で解説します。
Q1. \n
と \r\n
、どちらを使うべきですか?
A.
原則として、プログラム内で改行を制御する場合は「\n」で十分なケースが多いです。ただし、ファイル出力や他のシステムとデータをやり取りする場合は、環境依存を避けるためにSystem.getProperty("line.separator")
を使うのがおすすめです。これにより、実行環境に適した改行コードが自動的に選ばれます。
Q2. System.out.println()
とSystem.out.print("\n")
の違いは?
A.System.out.println()
は出力の末尾に環境依存の改行コードを自動で付与します。
一方、System.out.print("\n")
は常に「\n」なので、OSによっては意図通りに改行されない場合があります。特にファイル出力時はprintln()
の方が安全です。
Q3. テキストブロックのインデントや余計な改行が気になります。どうすれば良いですか?
A.
テキストブロックでは、先頭の共通インデントが自動的に除去されるため、左端を揃えて書くのが基本です。
また、末尾に余計な空行やスペースが入っていると、そのまま出力や保存に反映されます。不要な空白は意識して省きましょう。
Q4. Scannerで数値の後に文字列を入力したら、何も入力できないのはなぜ?
A.nextInt()
やnext()
で数値や単語を読み取った後、改行文字(Enter)がバッファに残っているためです。続けてnextLine()
で文字列を取得したい場合は、間にscanner.nextLine()
を一度挟んで改行を消費する必要があります。
Q5. Java 15未満でも複数行の文字列をきれいに書く方法はありますか?
A.
Java 15未満の場合、テキストブロックは使えません。その場合は、+
で文字列を連結したり、\n
を使って手動で複数行に分ける方法を使うのが一般的です。
String text = "1行目\n"
+ "2行目\n"
+ "3行目";
可読性を意識して、適切な位置で改行やインデントを入れるのがポイントです。
9. まとめと次なる学習への案内
本記事では、Javaで改行を扱うための基本から応用まで、さまざまな方法と注意点を解説してきました。
Javaはシンプルな構文ながらも、改行一つとっても奥が深く、環境や用途によって最適な手法が異なります。
改めてポイントを振り返ります。
- 「\n」と
System.out.println()
を使えば、基本的な改行は簡単に実現できる - OSごとの改行コードの違いを意識し、環境依存を回避したい場合は
System.getProperty("line.separator")
が有効 - Java 15以降ならテキストブロックを活用し、複数行のリテラルを直感的に記述できる
- Scannerによる入力処理では「改行消費」問題に注意する
改行制御は小さなテーマですが、理解を深めることで「どの環境でも安心して動作するプログラム」や「見やすく、保守しやすいコード」につながります。
これからさらにJavaを深く学びたい方は、次のようなテーマにもチャレンジしてみてください。
- 文字列の結合や分割、フォーマット(
String.format
やStringBuilder
の活用) - ファイル入出力時の文字コードと改行の扱い
- 標準入力・標準出力と例外処理
- Javaの国際化(ローカライズ)対応
些細なテクニックや知識の積み重ねが、実務でも大きな武器になります。
本記事が、あなたのJava学習と実務スキル向上の一助となれば幸いです。