使用“\ t”(选项卡)打印不会导致对齐的列

时间:2011-05-14 08:59:28

标签: java tabs text-formatting

我有一个非常奇怪的问题。写完之后:

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

为什么标签出现问题?

8 个答案:

答案 0 :(得分:31)

this question上构建,我使用以下代码来缩进我的消息:

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);

这是输出:

short text:                             indented
looooooooooooooong text:                indented

答案 1 :(得分:22)

标签的“问题”是它们将文本缩进到固定的标签位置,通常是4或8个字符的倍数(取决于显示它们的控制台或编辑器)。你的第一个文件名是7个字符,所以下一个标签在结束后停在第8位。你的后续文件名是8个字符长,所以下一个标签位于第12位。

如果要确保列在同一位置得到很好的缩进,则需要考虑以前列的实际长度,并修改以下选项卡的数量,或者改为填充所需的空格数。后者可以使用例如具有适当System.out.printfformat specification(例如"%1$13s"指定将第一个参数显示为字符串的最小宽度为13个字符。)

答案 2 :(得分:5)

继续Péter和邓肯的评论,我通常使用快速填充方法,如 -

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

同样,您也可以拥有lpad()

答案 3 :(得分:5)

你在每一行提供的文本长度是不同的,这就是问题,所以如果第二个单词太长(see2.txt长8个字符,对应一个标签长度)它打印出一个转到下一个制表点的标签。 解决此问题的一种方法是以编程方式向f.getName()文本添加填充,以便生成的每个文本:see.txtsee2.txt具有相同的长度(例如see.txt_和{{ 1}})所以每个标签会自动转到相同的制表点。

如果您使用JDK 1.5进行开发,可以使用java.util.Formatter解决此问题:

see2.txt

这个例子会给你这个印刷品:

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

答案 4 :(得分:2)

问题是文件名的长度。第一个文件名只有7个字符长,因此选项卡出现在char 8(每4个字符后执行一个制表符)。然而,下一个文件名是8个字符长,所以下一个标签将不会到char 12.如果你的文件名超过11个字符,你会再次遇到同样的问题。

答案 5 :(得分:2)

正如其他人所说,字符串的可变长度是个问题。

Apache Commons没有重新发明轮子,而是在StringUtils中为此提供了一个很好的,干净的解决方案。

StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.

答案 6 :(得分:1)

您还可以使用Guava的Strings.padEnd(String input, int minLength, char padding)

将字符串填充到所需的长度

答案 7 :(得分:1)

您可以使用此示例来处理您的问题:

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

您可以使用"%"直到找到满足您需求的正确路线