2013-10-17 63 views
2

我正在寫一個簡單的日記控制檯程序。無法真正弄清楚分解來自用戶的文本輸入的最簡單方式。我在一個字符串中記錄日記,然後我希望能夠將該字符串打印到控制檯,但未格式化它當然只是在終端的一條長線上顯示字符串,使其非常不友好地閱讀。我會如何顯示每個x字符左右的換行符?我所能找到的關於文本格式的東西都是System.out.printf(),但它只有最少量的要打印的字符。爲Java控制檯設置文本輸出格式

+0

如果您想硬包裝'String',則需要手動插入換行符。您可以'System.out.print'單個單詞,並且字符數可以在達到閾值時插入換行符。 –

+0

您可以先使用String.split(「」)將其拆分爲單詞。 – Kayaman

回答

6

我會建議使用一些外部庫來做,比如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); 

這將包裹你的字符串,尊重空間'',固定寬度

無外部庫

您必須實現它:

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

'String'有一個'length()'而不是'size()'。 –

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循環打印。

0

您可以使用Java java.util.StringTokenizer通過空格字符拆分單詞,然後在循環中,您可以在每行最喜歡的單詞數之後添加「\ n」。

這不是每個字符,但可能由於到達的字符數量太多而無法在任何地方分割單詞。

+0

作爲我發佈的答案代碼? :P – RamonBoza

+0

是的。這可能是使用String.split(..)更推薦的解決方案。 – BuddhaAir

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – DreadPirateShawn

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

+0

有兩個問題,爲什麼麻煩聲明'separator'變量,如果你從來沒有使用它,並且'NEW_LINE'聲明在哪裏(除非這是一個Java常量)? 另外,如果您不知道,可以使用'%n'格式化一個對系統正確的換行符。 – SpencerD