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

这是输出:

短文本:缩进
looooooooooooooong 文本:缩进

这在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

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

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

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 个字符长,因此制表符出现在 char 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 回答
1

您还可以使用 Guava 的Strings.padEnd(String input, int minLength, char padding)将字符串填充到所需的长度

于 2013-03-30T23:46:00.953 回答