38

私は非常に奇妙な問題を抱えています。これを書いた後:

for (File f : currentFile.listFiles()) {            
    if  (f.isDirectory()){
        System.out.println(f.getName()+"\t"+"Dir\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }
    else{
        System.out.println(f.getName()+"\t"+"File\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }

私はこれが印刷されているのを見ます:

see.txt File    rw  267642728448
see1.txt    File    rw  267642728456
see2.txt    File    rw  267642728448

タブに問題があるのはなぜですか?

4

8 に答える 8

44

この質問に基づいて、次のコードを使用してメッセージをインデントします。

String prefix1 = "short text:";
String prefix2 = "looooooooooooooong text:";
String msg = "indented";
/*
* The second string begins after 40 characters. The dash means that the
* first string is left-justified.
*/
String format = "%-40s%s%n";
System.out.printf(format, prefix1, msg);
System.out.printf(format, prefix2, msg);

これは出力です:

短いテキスト: インデント
looooooooooong テキスト: インデント

これについては、 の「フラグ文字」セクションに記載されていman 3 printfます。

于 2014-01-01T21:56:47.917 に答える
27

タブの「問題」は、テキストを固定タブ位置(通常は4文字または8文字の倍数)にインデントすることです(タブを表示するコンソールまたはエディターによって異なります)。最初のファイル名は7文字であるため、終了後の次のタブストップは位置8にあります。ただし、後続のファイル名は8文字の長さであるため、次のタブストップは位置12にあります。

列が同じ位置で適切にインデントされるようにする場合は、前の列の実際の長さを考慮して、後続のタブの数を変更するか、代わりに必要な数のスペースを埋める必要があります。後者は、たとえばSystem.out.printf適切なフォーマット指定を使用して実現できます(たとえば"%1$13s"、最初の引数を文字列として表示するための最小幅13文字を指定します)。

于 2011-05-14T09:02:53.307 に答える
7

各行で提供しているテキストの長さは異なります。これが問題です。2 番目の単語が長すぎる場合 ( see2.txt1 つのタブの長さに対応する長い 8 文字)、タブが出力されます。次の集計ポイント。これを解決する 1 つの方法は、プログラムでテキストにパッドを追加して、生成f.getName()された各テキストが同じ長さ (たとえばand ) になるようにして、各タブが自動的に同じ集計ポイントに移動するようにすることです。see.txtsee2.txtsee.txt_see2.txt

JDK 1.5 で開発している場合は、java.util.Formatterを使用してこれを解決できます。

String format = "%-20s %5d\n";
System.out.format(format, "test", 1);
System.out.format(format, "test2", 20);
System.out.format(format, "test3", 5000);

この例では、次の出力が得られます。

test                     1
test2                   20
test3                 5000
于 2016-02-21T13:35:59.170 に答える
5

ピーターとダンカンによるコメントの続きで、私は通常、次のようなクイックパディングメソッドを使用します-

public String rpad(String inStr, int finalLength)
{
    return (inStr + "                          " // typically a sufficient length spaces string.
        ).substring(0, finalLength);
}

lpad()同様に、あなたも持つことができます

于 2011-05-14T09:20:36.500 に答える
3

他の人が述べたように、文字列の可変長が問題です。

車輪を再発明するのではなく、Apache Commons は StringUtils でこれに対する優れたクリーンなソリューションを提供しています。

StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.
于 2016-10-06T12:20:53.203 に答える
2

問題はファイル名の長さです。最初のファイル名の長さはわずか7文字であるため、タブは文字8で発生します(4文字ごとにタブを実行します)。ただし、次のファイル名は8文字の長さであるため、次のタブは文字12まで表示されません。11文字より長いファイル名がある場合は、同じ問題が再び発生します。

于 2011-05-14T09:02:54.077 に答える
2

この例を使用して問題を処理できます。

System.out.printf( "%-15s %15s %n", "name", "lastname");
System.out.printf( "%-15s %15s %n", "Bill", "Smith");

ニーズを満たす適切な配置が見つかるまで、「%」で遊ぶことができます

于 2016-08-31T14:23:57.087 に答える