Java:print/output 彩色和格式化文本到控制台,在 Windows 机器上

Java: print/output colorized & formatted text to console, on a Windows machine

我正在尝试 print/output 彩色和格式化的文本到控制台,在机器上 运行 Windows 8(64x).

我正在读取 CSV 文件,使用此数据初始化 Product 对象的属性,并将这些对象存储在名为 productList 的 ArrayList 中。使用比较器对这个列表进行排序后,我试图以 'neat' 格式的方式打印排序结果(这是我下面的代码 'should' 所做的。此外,我正在尝试改变输出的颜色。这是我遇到问题的地方。

我一直在尝试使用 Janis 进行着色,但我被卡住了。我的主要问题是格式化输出显示为:

console.printf(format, "Name", "Category", "Price");

虽然彩色输出通过以下方式显示:

AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);

我不确定如何在同一个 print() 中同时使用 AnsiConsole 和 Console 的功能。

我在下面包含了两段代码。第一个是我程序中的 displaySorted(),旨在以 table 方式格式化我的输出。第二段代码,是我一直在玩的东西,试图显示格式化的、彩色的文本。我将第二部分包括在内,以展示我的一些想法并提供更多信息。

我还将包括一些我在尝试与 Janis 合作时使用过的链接:

http://grepcode.com/snapshot/repo1.maven.org/maven2/org.fusesource.jansi/jansi/1.9

http://www.doublecloud.org/2013/10/writing-colorful-console-output-in-java/

https://forum.ragezone.com/f428/using-jansi-library-server-console-948744/

这是我第一次尝试做这样的事情,可能我做错了。

如果您有更好的方法在 Windows 机器上显示格式化和彩色输出,我洗耳恭听。

请附上代码和建议,因为这对我来说是一个新领域。谢谢。

 public static void displaySorted(List<Product> productList) {

       //  To enable/disable the ANSI capability, you would need to install/uninstall it with a static 
       //  method: AnsiConsole.systemInstall(); AnsiConsole.systemUninstall();
   
      // AnsiConsole.systemInstall();
   Console console = null;
   Iterator<Product> iterator = WareHouse.productList.iterator();
   try {
    console = System.console();
    
    if(console != null) {
     String format = "%1s %2s %3s%n";
     while (iterator.hasNext()) {
      Product product = (Product)iterator.next();
      console.printf(format, "Name", "Category", "Price");
      console.printf(format, "-----", "-----", "-----");
      console.printf(format, product.getName(), product.getCategory(), product.getPrice()); 
     }
    }  
   }
   /*if error occurs*/
   catch(Exception exception) {
   exception.printStackTrace(); 
   }
   // AnsiConsole.systemUninstall();
  }

package app;

import java.io.Console;

import org.fusesource.jansi.*;

public class Main {
 public static final String BLACK = "\u001B[0;30m";
    public static final String RED = "\u001B[0;31m";
    public static final String GREEN = "\u001B[0;32m";
    public static final String YELLOW = "\u001B[0;33m";
    public static final String BLUE = "\u001B[0;34m";
    public static final String MAGENTA = "\u001B[0;35m";
    public static final String CYAN = "\u001B[0;36m";
    public static final String WHITE = "\u001B[0;37m";
    public static final String ANSI_CLS = "\u001b[2J";
    public static final String ANSI_HOME = "\u001b[H";
    public static final String ANSI_BOLD = "\u001b[1m";
    public static final String ANSI_AT55 = "\u001b[10;10H";
    public static final String ANSI_REVERSEON = "\u001b[7m";
    public static final String ANSI_NORMAL = "\u001b[0m";
    public static final String ANSI_WHITEONBLUE = "\u001b[37;44m";
    

    /********************test fields********************/
    public static String name;
    public static String category;
    public static String price;
    
 public static void main(String[] args) {
  
  setName();
  setCategory();
  setPrice();
  
  display();
 }
 
 public static void display() {
  //AnsiConsole.systemInstall();
  Console console = null;
  try {
    console = System.console();
    
    if(console != null) {
     String format = "%1s %2s %3s%n";

      console.printf(format, "Name", "Category", "Price");
      console.printf(format, "-----", "-----", "-----");
      console.printf(format, getName(), getCategory(), getPrice()); 
    } 
   // AnsiConsole.systemUninstall();
   }
   /*if error occurs*/
   catch(Exception exception) {
   exception.printStackTrace(); 
   }
  }
 
 /********************set & get********************/
 
 /**********name**********/
 public static void setName() {
  name = "Bob";
 }
 
 public static String getName() {
  return name;
 }
 
 /**********category**********/
 public static void setCategory() {
  category = "Things";
 }
 
 public static String getCategory() {
  return category;
 }
 
 /**********price**********/
 public static void setPrice() {
  price = ".0";
 }
 
 public static String getPrice() {
  return price;
 }
 
 /*********************asci********************/
 
 public static void makeBlue(String blueString) {
  AnsiConsole.out.println(BLUE + blueString + ANSI_NORMAL);
 }
 
 public static void makeGreen(String greenString) {
  AnsiConsole.out.println(GREEN + greenString + ANSI_NORMAL);
 }
 
 public static void makeYellow(String yellowString) {
  AnsiConsole.out.println(YELLOW + yellowString + ANSI_NORMAL);
 }
 
 public static void makeMagenta(String magentaString) {
  AnsiConsole.out.println(MAGENTA + magentaString + ANSI_NORMAL);
 }
 
 public static void makeBold(String boldString) {
  AnsiConsole.out.println(ANSI_BOLD + boldString + ANSI_NORMAL);
 }
}

我认为最简单的方法是完全跳过使用控制台进行格式化,而只使用 String.format(String format, Object... args)。它具有相同的参数,但不是直接打印到控制台,而是 returns 格式化字符串。然后,您可以将返回的字符串发送到 AnsiConsole 以对其进行着色。所以在你的第二个例子中你可以替换

    if (console != null) {
        String format = "%1s %2s %3s%n";

        console.printf(format, "Name", "Category", "Price");
        console.printf(format, "-----", "-----", "-----");
        console.printf(format, getName(), getCategory(), getPrice());
    }

    if (console != null) {
        String format = "%1s %2s %3s%n";
        String output;
        output = String.format(format, "Name", "Category", "Price");
        makeBlue(output);
        output = String.format(format, "-----", "-----", "-----");
        makeBlue(output);
        output = String.format(format, getName(), getCategory(), getPrice());
        makeBlue(output);
    }

如果你不想用变量来存储格式化的输出,你可以直接将 String.format 的输出传递给 makeBlue(或任何颜色)

    if (console != null) {
        String format = "%1s %2s %3s%n";
        makeBlue(String.format(format, "Name", "Category", "Price"));
        makeBlue(String.format(format, "-----", "-----", "-----"));
        makeBlue(String.format(format, getName(), getCategory(), getPrice()));
    }