使用“\t”(制表符)打印不会导致列对齐

2022-09-01 03:33:33

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

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

为什么选项卡有问题?


答案 1

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

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

这在 man 3 printf 的“标志字符”一节中有记载。


答案 2

选项卡的“问题”在于它们将文本缩进到固定的选项卡位置,通常是4或8个字符的倍数(取决于显示它们的控制台或编辑器)。您的第一个文件名是 7 个字符,因此其末尾的下一个制表位位于位置 8。但是,后续文件名的长度为 8 个字符,因此下一个制表位位于位置 12。

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


推荐