1. 概述

在 Java 开发中,经常需要将数据以表格形式展示。System.out 提供了多种实现方式,从简单的字符串拼接到高级格式化技术。本文将探索使用 System.out 实现表格输出的几种方法。

2. 使用字符串拼接

最基础的方式是字符串拼接。虽然简单直接,但需要手动调整空格和对齐:

void usingStringConcatenation() {
    String[] headers = {"ID", "Name", "Age"};
    String[][] data = {
        {"1", "James", "24"},
        {"2", "Sarah", "27"},
        {"3", "Keith", "31"}
    };

    System.out.println(headers[0] + "   " + headers[1] + "   " + headers[2]);

    for (String[] row : data) {
        System.out.println(row[0] + "   " + row[1] + "   " + row[2]);
    }
}

输出结果:

ID   Name   Age
1   James   24
2   Sarah   27
3   Keith   31

⚠️ 缺陷:这种方法在处理动态数据时非常麻烦,需要手动调整空格才能保持对齐。

3. 使用 printf()

System.out.printf() 提供更灵活的格式化能力。我们可以指定列宽并确保对齐:

void usingPrintf() {
    String[] headers = {"ID", "Name", "Age"};
    String[][] data = {
        {"1", "James", "24"},
        {"2", "Sarah", "27"},
        {"3", "Keith", "31"}
    };

    System.out.printf("%-5s %-10s %-5s%n", headers[0], headers[1], headers[2]);

    for (String[] row : data) {
        System.out.printf("%-5s %-10s %-5s%n", row[0], row[1], row[2]);
    }
}

输出结果:

ID    Name       Age  
1     James      24   
2     Sarah      27   
3     Keith      31  

优势

  • %-5s 表示左对齐字符串,宽度为 5 个字符
  • %-10s 表示左对齐字符串,宽度为 10 个字符
  • 无论数据长度如何,列都能自动对齐

4. 使用 String.format()

当需要将格式化结果存储为字符串而非直接打印时,使用 String.format()。其语法与 printf() 完全一致:

void usingStringFormat() {
    String[] headers = {"ID", "Name", "Age"};
    String[][] data = { 
        {"1", "James", "24"}, 
        {"2", "Sarah", "27"}, 
        {"3", "Keith", "31"} 
    };

    String header = String.format("%-5s %-10s %-5s", headers[0], headers[1], headers[2]);
    System.out.println(header);

    for (String[] row : data) {
        String formattedRow = String.format("%-5s %-10s %-5s", row[0], row[1], row[2]);
        System.out.println(formattedRow);
    }
}

输出结果与 printf() 示例相同:

ID    Name       Age  
1     James      24   
2     Sarah      27   
3     Keith      31   

关键区别String.format() 返回格式化后的字符串,可用于后续处理或日志记录。

5. 使用 StringBuilder

处理动态或大数据量时,使用 StringBuilder 构建表格更高效。它能将整个输出合并为单次打印:

void usingStringBuilder() {
    String[] headers = {"ID", "Name", "Age"};
    String[][] data = { 
        {"1", "James", "24"}, 
        {"2", "Sarah", "27"}, 
        {"3", "Keith", "31"} 
    };

    StringBuilder table = new StringBuilder();

    table.append(String.format("%-5s %-10s %-5s%n", headers[0], headers[1], headers[2]));

    for (String[] row : data) {
        table.append(String.format("%-5s %-10s %-5s%n", row[0], row[1], row[2]));
    }

    System.out.print(table.toString());
}

输出结果:

ID    Name       Age  
1     James      24   
2     Sarah      27   
3     Keith      31  

适用场景

  • 需要构建复杂输出时
  • 性能敏感场景(减少多次字符串拼接的开销)

6. 使用 ASCII Table

第三方库如 ASCII Table 能快速生成美观的 ASCII 表格。首先添加 Maven 依赖:

<dependency>
    <groupId>de.vandermeer</groupId>
    <artifactId>asciitable</artifactId>
    <version>0.3.2</version>
</dependency>

使用示例:

void usingAsciiTable() {
    AsciiTable table = new AsciiTable();
    table.addRule();
    table.addRow("ID", "Name", "Age");
    table.addRule();
    table.addRow("1", "James", "24");
    table.addRow("2", "Sarah", "27");
    table.addRow("3", "Keith", "31");
    table.addRule();
    String renderedTable = table.render();
    System.out.println(renderedTable);
}

输出结果:

┌──────────────────────────┬─────────────────────────┬─────────────────────────┐
│ID                        │Name                     │Age                      │
├──────────────────────────┼─────────────────────────┼─────────────────────────┤
│1                         │James                    │24                       │
│2                         │Sarah                    │27                       │
│3                         │Keith                    │31                       │
└──────────────────────────┴─────────────────────────┴─────────────────────────┘

优势:自动添加边框和分隔线,输出更专业美观。

7. 总结

根据场景选择合适的表格输出方案:

方法 适用场景 优点 缺点
字符串拼接 简单静态数据 无需额外知识 维护性差,对齐易错
printf() 直接打印格式化表格 简单高效,自动对齐 无法复用格式化结果
String.format() 需要存储格式化字符串 灵活复用 代码稍显冗长
StringBuilder 大数据量/动态表格 性能优越 手动处理格式
ASCII Table 库 需要专业美观的表格 自动边框对齐 需引入外部依赖

🔥 简单粗暴选型建议

  • 临时调试:用 printf()
  • 需要复用格式:用 String.format()
  • 大数据量:用 StringBuilder
  • 正式输出:直接上 ASCII Table 库

原始标题:Format Output in a Table Format Using System.out | Baeldung