Java中如何为控制台格式化文本输出?

3

我正在编写一个简单的日记控制台程序,但无法确定从用户那里获取文本输入的最简单方法。我将一条日记记录作为字符串输入,然后希望能够将该字符串打印到控制台上,但当然要去除格式,只是在终端上显示一行长字符串,使其非常难以阅读。如何在每个x个字符左右显示一个新行来显示字符串?我能找到的所有文本格式化信息都是关于System.out.printf(),但它只有一个最小的需要打印的字符数。


如果您想对一个 String 进行硬换行,您需要手动插入换行符。您可以使用 System.out.print 打印单个单词,并计算字符数,当达到阈值时插入换行符。 - Boris the Spider
你可以先使用 String.split(" ") 将其分割成单词。 - Kayaman
4个回答

7
我建议使用一些外部库来完成这项任务,例如Apache commons:
可以使用以下链接查看文档:http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html 同时,可以使用以下方法进行操作: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html#wrap(java.lang.String, int)
static final int FIXED_WIDTH = 80;

String myLongString = "..."; // very long string
String myWrappedString = WordUtils.wrap(myLongString,FIXED_WIDTH);

这将使用固定宽度对字符串进行换行处理,同时保留空格。

不使用外部库

您需要自己实现此功能:

顺带一提:我这里没有 Java 编译器来测试代码,所以如果不能直接编译通过,请不要怒气冲冲。

private final static int MAX_WIDTH = 80;

public String wrap(String longString) {
    String[] splittedString = longString.split(" ");
    String resultString = "";
    String lineString = "";

    for (int i = 0; i < splittedString.length; i++) {
        if (lineString.isEmpty()) {
            lineString += splittedString[i];
        } else if (lineString.length() + splittedString[i].length() < MAX_WIDTH) {
            lineString += splittedString[i];
        } else {
            resultString += lineString + "\n";
            lineString = "";
        }
    }

    if(!lineString.isEmpty()){
            resultString += lineString + "\n";
    }

    return resultString;
}

1
Stringlength() 而不是 size() - Boris the Spider

4

如果您可以使用Apache Common Lang库,您可以使用WordUtils类(org.apache.commons.lang.WordUtils)。例如:

System.out.println("\nWrap length of 20, \\n newline, don't wrap long words:\n" + WordUtils.wrap(str2, 20, "\n", false)); [Source here][1]

如果您无法实现此功能,可以使用程序员菜谱博客中提供的此函数。 自定义文本换行的代码
static String [] wrapText (String text, int len)
{
  // return empty array for null text
 if (text == null)
   return new String [] {};

 // return text if len is zero or less
 if (len <= 0)
   return new String [] {text};

 // return text if less than length
  if (text.length() <= len)
   return new String [] {text};

  char [] chars = text.toCharArray();
  Vector lines = new Vector();
  StringBuffer line = new StringBuffer();
  StringBuffer word = new StringBuffer();

  for (int i = 0; i < chars.length; i++) {
      word.append(chars[i]);

      if (chars[i] == ' ') {
        if ((line.length() + word.length()) > len) {
          lines.add(line.toString());
          line.delete(0, line.length());
        }

        line.append(word);
        word.delete(0, word.length());
      }
  }

 // handle any extra chars in current word
 if (word.length() > 0) {
   if ((line.length() + word.length()) > len) {
     lines.add(line.toString());
     line.delete(0, line.length());
  }
  line.append(word);
 }

// handle extra line
if (line.length() > 0) {
  lines.add(line.toString());
}

String [] ret = new String[lines.size()];
int c = 0; // counter
for (Enumeration e = lines.elements(); e.hasMoreElements(); c++) {
   ret[c] = (String) e.nextElement();
}

return ret;
}

这将返回一个字符串数组,使用for循环进行打印。

0

您可以使用以下代码代替。

String separator = System.getProperty("line.separator");
String str = String.format("My line contains a %s break line", NEW_LINE);
System.out.println(str)

您可以参考此链接。 Java多行字符串


两个问题,如果你从未使用它,为什么要声明separator变量?NEW_LINE在哪里声明(除非它是Java常量)?此外,如果你不知道,你可以使用%n来格式化一个换行符,这对于系统是正确的。 - Spencer D

0
你可以使用Java的java.util.StringTokenizer将单词按空格分割,然后在循环中,在每行超过你喜欢的单词数之后添加一个"\n"。
这不是按字符计算,但也许在任意位置分割单词会因为达到字符数而降低可读性。

是的。这可能是更推荐的解决方案,可以使用String.split(..)函数。 - BuddhaAir
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - DreadPirateShawn
@DreadPirateShawn 在我看来,从我在这个网站上花费的几个月来看,这已经足够作为一个答案了。 - nanofarad
1
@hexafraction -- 没有任何冒犯之意。此答案被StackOverflow自动标记为需要审核,评论也是由系统自动生成的。鉴于其他两个答案都提供了代码解决方案,相比之下,这个答案似乎缺乏明确说明。话虽如此,感谢您表达关注!并非所有的管理决策都是完美的,我们始终欢迎不同的观点。 - DreadPirateShawn
@DreadPirateShawn 感谢您的理解。这是我第二天处理标志的权限,所以我还在适应更正式的政策。 - nanofarad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接