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

Unk*_*ser 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());
    }
Run Code Online (Sandbox Code Playgroud)

我看到这印:

see.txt File    rw  267642728448
see1.txt    File    rw  267642728456
see2.txt    File    rw  267642728448
Run Code Online (Sandbox Code Playgroud)

为什么标签出现问题?

Mat*_*aun 32

基于这个问题,我使用以下代码来缩进我的消息:

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);
Run Code Online (Sandbox Code Playgroud)

这是输出:

short text:                             indented
looooooooooooooong text:                indented


Pét*_*rök 25

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

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


mad*_*adx 6

你在每一行中提供的文本长度是不同的,这就是问题,所以如果第二个单词太长(see2.txt长8个字符,对应一个标签长度),它会打印出一个标签,下一个制表点.解决它的一种方法是以编程方式向f.getName()文本添加填充,以便生成每个文本:see.txtsee2.txt具有相同的长度(例如see.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);
Run Code Online (Sandbox Code Playgroud)

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

test                     1
test2                   20
test3                 5000
Run Code Online (Sandbox Code Playgroud)


d-l*_*ive 5

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

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

同样,你可以有一个lpad(),以及