在Java中格式化控制台的文本输出

时间:2013-10-17 11:29:24

标签: java command-line-interface

我正在写一个简单的日记控制台程序。无法真正弄清楚从用户那里分解文本输入的最简单方法。我在字符串中输入日记,然后我希望能够将该字符串打印到控制台,但是未格式化它当然只是在终端的一条长行中显示字符串,这使得读取非常不友好。如何为每个x字符左右显示一个新行的字符串?我能找到的关于文本格式的所有内容都是System.out.printf(),但是只需要打印最少量的字符。

4 个答案:

答案 0 :(得分: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);

这将包装你的String,尊重空格'',具有固定的宽度

没有外部图书馆

您必须实施它:

BTW:我这里没有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 :(得分:4)

如果可以使用apache常见的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]

如果你不能,你可以在programmerscookbook博客中使用这个功能。 code to do custom wrapping of text

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循环进行打印。

答案 2 :(得分:0)

您可以使用Java java.util.StringTokenizer按空格字符拆分单词,然后在循环中,您可以在每行最喜欢的单词数之后添加“\ n”。

这不是每个字符,但由于到达的字符数,可能在任何地方拆分单词都不太可读。

答案 3 :(得分: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 multiline string