HOWTO · Java

Java でタブスペースを挿入する方法

エスケープシーケンス、Unicode U+0009、文字列構築の代替手段を使って、Java で水平タブを挿入する方法を学びます。

このページの内容

Javaで文字列の間に水平タブを入れるには、文字列リテラル内にエスケープシーケンス \t を記述します。タブによって次の文字列は次のタブストップまで移動します。表示される間隔は、出力を表示するプログラムによって異なります。

次の例を実行します。

Javaで \t のタブエスケープシーケンスを使ってタブを挿入する

Javaソースでは、バックスラッシュと t が1つのエスケープシーケンスを構成します。Javaは文字列を作成するときにこれをタブ文字へ変換するため、タブを入れたい位置に記述します。

public class TabExample {
  public static void main(String[] args) {
    System.out.println("Name:\tAda");
  }
}

このプログラムは、Name:、水平タブ、Ada の順に1行で出力します。ターミナルやエディターなど、出力を表示する環境がタブストップの幅を決めるので、見える空きは一定数の空白とは限りません。

JavaでUnicode文字を使ってタブを挿入する

水平タブはUnicodeコードポイント U+0009 です。JavaソースではUnicodeエスケープ \u0009 も認識されるため、値の間に連結すればその位置にタブを挿入できます。詳しくはUnicode文字のリファレンスを参照してください。Unicodeは文字の符号化方式に関する標準であり、すべての文字を固定の16ビットで符号化するものではありません。

次の完全な例では、2つの値の間にUnicodeエスケープを使います。表示される出力には水平タブが含まれますが、その幅は出力環境のタブストップによって変わります。

public class TabExample {
  public static void main(String[] args) {
    String tab = "\u0009";
    System.out.println("Name:" + tab + "Ada");
  }
}
Name:	Ada

通常のJava文字列では、"\t" が同じ水平タブ文字を表す、より短く馴染みのある書き方です。

Javaで String.format を使って空白で幅をそろえる

String.format は書式文字列に従って値を整形します。フィールド幅を指定すると、短い値には空白が追加されます。タブ文字が挿入されるわけではありません。この完全な例では、Name: の幅を最低10文字にするため、Ada の前に5つの空白が入ります。

public class TabExample {
  public static void main(String[] args) {
    String formatted = String.format("%-10s%s", "Name:", "Ada");
    System.out.println(formatted);
  }
}
Name:     Ada

データに実際のタブを含める場合は \t を使います。空白による幅埋めが目的ならフィールド幅を使います。どちらの場合も、プロポーショナルフォントを使うと列が不ぞろいに見えることがあり、値が指定した幅を超えた場合にも整列が崩れることがあります。

Javaで StringBuilder または StringBuffer を使ってタブを挿入する

複数の要素から文字列を組み立てるときは、要素のつなぎ目にタブを追加します。この例では、どちらのクラスでも同じ方法で文字列を作り、Name: と Ada の間に '\t' を追加します。

public class TabExample {
  public static void main(String[] args) {
    StringBuilder builder = new StringBuilder();
    builder.append("Name:").append('\t').append("Ada");
    System.out.println(builder);

    StringBuffer buffer = new StringBuffer();
    buffer.append("Name:").append('\t').append("Ada");
    System.out.println(buffer);
  }
}
Name:	Ada
Name:	Ada

StringBuffer の操作は同期されますが、StringBuilder の操作は同期されません。常にどちらかが速いと決めつけず、バッファの操作に同期が必要かどうかで選びます。どちらも段階的に文字列を組み立てる用途に適しています。短く固定された文字列なら、値を "\t" で連結するほうが簡潔です。タブの表示幅は出力環境によって変わります。

Javaで System.out.print を複数回使ってタブを挿入する

各要素を System.out.print で出力すると同じ行に続けて表示できます。最後の値には println を使い、行を終わらせます。呼び出しの間にあるタブは、出力環境が決める次のタブストップまで移動します。

public class TabExample {
  public static void main(String[] args) {
    System.out.print("Name:");
    System.out.print('\t');
    System.out.println("Ada");
  }
}
Name:	Ada

要素が別々に生成される場合には、この方法が便利です。1つの式で済むなら、\t を含む文字列のほうが簡潔です。

まとめ

Java文字列に水平タブをそのまま入れるには \t を使います。U+0009 と \u0009 は同じタブ文字を表し、String.format のフィールド幅は簡単な位置合わせのために空白を追加します。StringBuilder、StringBuffer、複数回のprint呼び出しを使えば、文字列を組み立てたり出力したりする途中にタブを挿入できます。次の値までの見かけの間隔は、出力環境のタブストップによって変わります。