PrintWriterのインスタンスと、バイト・ストリーム・クラスであるPrintStreamのインスタンスです。
PrintStreamオブジェクトは、System.outとSystem.errだけです。 (これらのオブジェクトの詳細は、『コマンドラインを使用したI/O』を参照してください。) フォーマットされた出力ストリームを作成する必要がある場合は、PrintStreamではなくPrintWriterをインスタンス化してください。
すべてのバイト・ストリーム・オブジェクトと文字ストリーム・オブジェクトと同様に、PrintStreamとPrintWriterのインスタンスも、単純なバイト出力および文字出力のためのwriteメソッドの標準的なセットを実装しています。 さらに、PrintStreamとPrintWriterのいずれも、内部データをフォーマットされた出力に変換するための、同じメソッドのセットを実装しています。 次の2つのレベルのフォーマット機能が用意されています。
printメソッドとprintlnメソッドでは、標準的な方法で個々の値を変換します。
formatメソッドでは、詳細な書式設定のための多数のオプションを使用し、書式文字列に基づいて値を整えます。処理できる値の数はほぼ無制限です。
printメソッドとprintlnメソッドprintメソッドとprintlnメソッドでは、単一の値を、適切なtoStringメソッドを使用して変換してから出力します。 この動作は、サンプルのRootで確認できます。
public class Root {
public static void main(String[] args) {
int i = 2;
double r = Math.sqrt(i);
System.out.print("The square root of ");
System.out.print(i);
System.out.print(" is ");
System.out.print(r);
System.out.println(".");
i = 5;
r = Math.sqrt(i);
System.out.println("The square root of " + i + " is " + r + ".");
}
}
Rootの出力結果は次のとおりです。
The square root of 2 is 1.4142135623730951. The square root of 5 is 2.23606797749979.
iと変数rは2回変換されています。 1回目は、オーバーロードされたprintメソッド内のコードによって行われ、2回目は、Javaコンパイラによって自動生成された変換コードによって実行されます。この変換コードでもtoStringが利用されます。 この方法ではあらゆる値を文字列に変換できますが、出力される文字列を細かく制御することはできません。
formatメソッドformatメソッドは、書式文字列に基づいて複数の引数の変換と書式設定を行います。 書式文字列は、書式指示子を含む静的なテキストです。書式指示子が含まれない場合、書式文字列はそのまま出力されます。
書式文字列では、多くの機能がサポートされます。 このチュートリアルでは、一部の基本的な事項のみを取り上げます。 全機能の説明については、API仕様の『Format String Syntax』を参照してください。
次のRoot2のサンプルでは、1回のformatの呼出しで2つの値の書式を設定しています。
public class Root2 {
public static void main(String[] args) {
int i = 2;
double r = Math.sqrt(i);
System.out.format("The square root of %d is %f.%n", i, r);
}
}
The square root of 2 is 1.414214.
%で始まり、1文字または2文字の変換文字で終わります。変換文字は、どのような書式の出力を生成するかを指定するものです。 ここでは、次の3つの変換文字が使用されています。
d:整数値を10進数値として書式設定します。
f:浮動小数点値を10進数値として書式設定します。
n:プラットフォーム固有の行区切り文字を出力します。
x:整数を16進数値として書式設定します。
s:任意の値を文字列に変換します。
tB:整数をロケール固有の月の名前に変換します。
%%と%nを除き、すべての書式指示子は引数に対応させる必要があります。 対応していない場合は、例外がスローされます。
Javaプログラミング言語では、エスケープ・シーケンスの\nを使用すると常に改行文字(\u000A)が生成されます。 改行文字を特に必要としている場合を除いて、\nは使用しないでください。 ローカル・プラットフォームに合った正しい行区切り文字を取得するには、%nを使用してください。
Formatでは、追加要素をできる限り使用しています。
public class Format {
public static void main(String[] args) {
System.out.format("%f, %1$+020.10f %n", Math.PI);
}
}
3.141593, +00000003.1415926536

書式指示子の要素
sやその他の一般的な変換文字の場合は、書式設定された値の最大文字数を表します。必要に応じて、値の右側が切り捨てられます。Formatプログラムでは、数値を常に符号付きでフォーマットすることを+フラグで指定し、埋める文字に0を使用することを0フラグで指定しています。 その他のフラグには、-(右埋め)、,(数値のフォーマットにロケール固有の桁区切り文字を使用)などがあります。 一部のフラグは、他の特定のフラグや特定の変換文字と併用できないことに注意してください。<を使用すると、前の書式指定子と同じ引数を指定できます。 つまり、上の例は次のように表すこともできます。 System.out.format("%f, %<+020.10f %n", Math.PI);