用“\ t”(制表符)打印不会导致alignment的列

非常奇怪的问题,

写完之后:

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个字符的倍数(取决于显示它们的控制台或编辑器)。 您的第一个文件名是7个字符,所以下一个制表符停止在位置8之后。然而,您的后续文件名是8个字符长,所以下一个制表位在位置12。

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

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

 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 

继续佩特和邓肯的评论,我通常使用快速填充方法,

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

同样你也可以有一个lpad()

你在每一行提供的文本的长度是不同的,这是问题,所以如果第二个单词太长( see2.txt是长8字符对应于单个标签长度)它打印出一个选项卡去下一个制表点。 解决这个问题的一个方法是以编程方式在f.getName()文本中添加一个pad,以便生成每个文本: 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); 

这个例子会给你这个打印:

 test 1 test2 20 test3 5000 

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

你也可以使用Guava的Strings.padEnd(String input,int minLength,char padding)将string填充到所需的长度。

你可以使用这个例子来处理你的问题:

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

你可以玩“%”,直到你find正确的路线来满足你的需求

正如其他人所说,string的可变长度是问题。

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

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