標準出力の全体像
標準出力(stdout)は「プログラムの結果やメッセージを画面(コンソール)へ出す」ための出力先です。Java では System.out(型は PrintStream)を使って行い、print、println、printf(format)の3兄弟で用途を使い分けます。基本は「テキストを出す」「改行で区切る」「書式指定で整える」の3点を押さえれば十分です。
基本の使い方と改行の扱い
print と println の違い
System.out.print("Hello"); // 改行なしで出力
System.out.println("World"); // 出力して改行(次の文字は新しい行から)
System.out.println(42); // 数値もそのまま出力して改行
Javaprint はそのまま出すだけ、println は出力後に改行を自動付与します。行を区切りたいときは println を基本にすると読みやすくなります。
改行コードとエスケープ
System.out.print("1行目\n2行目"); // \n で改行(Unix系)
System.out.print("タブ\t区切り"); // \t でタブ
System.out.print("ダブルクォート: \""); // \" で引用符
Java文字列中の \n は改行、\t はタブ。Java の文字列リテラルでは「バックスラッシュ」で特殊文字を表現します。
書式化出力(printf/format)の使い方(重要ポイントの深掘り)
代表的な書式指定子
System.out.printf("整数=%d, 浮動小数=%.2f, 文字列=%s%n", 10, 3.14159, "Java");
// 出力例: 整数=10, 浮動小数=3.14, 文字列=Java
Java%d(整数)、%f(小数)、%s(文字列)、%n(プラットフォーム依存の改行)を覚えると、ほぼの用途をカバーできます。%.2f のように精度指定で「小数点以下2桁」などを制御できます。
幅揃え・ゼロ埋め・左寄せ
System.out.printf("[%5d]%n", 42); // 幅5で右寄せ: [ 42]
System.out.printf("[%05d]%n", 42); // ゼロ埋め: [00042]
System.out.printf("[%-5s]%n", "A"); // 左寄せ: [A ]
Java数表や列揃えでは「幅」「ゼロ埋め」「左寄せ」を使い、読みやすい表を作ります。%n を使うとOS非依存の改行になり、移植性が高まります。
ロケールを意識した書式(小数点・区切り)
System.out.printf(java.util.Locale.US, "%,.2f%n", 12345.678); // 12,345.68
System.out.printf(java.util.Locale.GERMANY, "%,.2f%n", 12345.678); // 12.345,68
Java国・地域で表記が変わる数値の出力は、ロケールを指定すると安全です。, フラグは「桁区切り」を付けます。
標準出力と標準エラーの違い(使い分けの設計)
System.out と System.err
System.out.println("処理開始"); // 通常メッセージ
System.err.println("エラー: 入力が不正"); // エラーメッセージ
JavaSystem.err は「エラーや警告」専用の出力先。コンソールでは同じ画面に見えますが、リダイレクト先を分けられるため、ログやパイプ処理で威力を発揮します。「正常系は out、異常系は err」に分けると運用が楽になります。
リダイレクトとパイプ(外部からの活用)
# 標準出力をファイルへ
java App > out.txt
# 標準エラーだけ別ファイルへ
java App 2> err.txt
# 標準出力を次コマンドへ渡す
java App | grep OK
CLI では「出力の使い分け」が後工程の効率を左右します。アプリ側で out/err を適切に分けておくと、運用で強くなります。
文字コード、バッファ、フラッシュ(重要ポイントの深掘り)
文字コードの前提
System.out はプラットフォームの既定エンコーディングに依存します。日本語の文字化けを避けたい場合は「実行環境の文字コード設定」を合わせるか、独自の PrintStream を用意して明示します。
var ps = new java.io.PrintStream(System.out, true, java.nio.charset.StandardCharsets.UTF_8);
ps.println("日本語の出力");
JavaIDE・端末側のエンコード設定も一致させるのが実務では重要です。
バッファリングと flush
出力は内部バッファに溜めて「まとめて書く」ことがあります。println や printf の %n は行末で適度にフラッシュされますが、「進捗表示」などリアルタイム性が必要なら System.out.flush() を使います。
System.out.print("処理中...");
System.out.flush(); // すぐ表示させたいとき
Javaストリームを閉じるときは close() でフラッシュされますが、標準出力は通常明示的に閉じません(他のライブラリ出力に影響するため)。
実用例で身につける
例 1: 表形式で綺麗に出す
public class Table {
public static void main(String[] args) {
System.out.printf("%-10s %6s %8s%n", "Name", "Qty", "Price");
System.out.printf("%-10s %6d %8.2f%n", "Apple", 3, 120.0);
System.out.printf("%-10s %6d %8.2f%n", "Banana", 12, 45.5);
}
}
Java列幅・寄せ・精度を組み合わせると、ログやレポートが一気に読みやすくなります。
例 2: 進捗バーの更新(フラッシュを活用)
public class Progress {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i <= 100; i += 10) {
System.out.printf("\rProgress: %3d%%", i); // 行頭に復帰して上書き
System.out.flush();
Thread.sleep(100);
}
System.out.println(); // 最後に改行
}
}
Java\r で行頭へ戻り、同じ行を更新します。フラッシュで即時表示に。
例 3: ロケールに応じた数値表記
public class LocaleFormat {
public static void main(String[] args) {
double v = 12345.678;
System.out.printf(java.util.Locale.US, "US: %,.2f%n", v);
System.out.printf(java.util.Locale.JAPAN, "JP: %,.2f%n", v);
System.out.printf(java.util.Locale.GERMANY, "DE: %,.2f%n", v);
}
}
Java国ごとの表記に合わせて、ユーザーに違和感のない出力を実現できます。
仕上げのアドバイス(重要部分のまとめ)
標準出力は「読み手に届く形」で出すのがすべてです。行区切りは println/%n、整形は printf の書式指定子、正常系と異常系は System.out/System.err に分ける。文字コードとフラッシュの挙動を理解し、必要に応じてロケールや列揃えで見やすさを徹底する。出力はテストにも運用にも直結します。「伝えるための書式」を選ぶ癖を、ここから身につけましょう。
