【问题标题】:Printing with "\t" (tabs) does not result in aligned columns使用“\t”(制表符)打印不会导致对齐的列
【发布时间】:2011-08-25 10:35:39
【问题描述】:

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

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

为什么标签有问题?

【问题讨论】:

    标签: java tabs text-formatting


    【解决方案1】:

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

    这是输出:

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

    这在man 3 printf 的“标志字符”部分中有记录。

    【讨论】:

    • 超过 2 个值呢?不行。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您在每行中提供的文本长度不同,这就是问题所在,所以如果第二个单词太长(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);
      

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

      test                     1
      test2                   20
      test3                 5000
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            问题在于文件名的长度。第一个文件名只有 7 个字符长,因此制表符出现在 char 8 处(每 4 个字符后执行一个制表符)。但是,下一个文件名的长度为 8 个字符,因此下一个选项卡将在 char 12 之前出现。如果您的文件名长度超过 11 个字符,您将再次遇到同样的问题。

            【讨论】:

              【解决方案7】:

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

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

              您可以使用“%”,直到找到满足您需求的正确对齐方式

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-17
                  • 1970-01-01
                  • 2014-12-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多