2012-07-23 69 views
0

我無法作出的StringTokenizer分手文本的幾行成單獨記號做記號。輸入的文本是StringTokenizer的不是新線

3 
monkeys 

但是,StringTokenizer顯然將它解釋爲「3monkeys」。我需要它是「3」和「猴子」。正因爲如此,NumberFormatException正在拋出,因爲我需要將字符串「3」轉換爲整數。

這是我到目前爲止的代碼。

Scanner f = new Scanner(new FileInputStream("input.txt")); // Yes, i have the actual input file path here, but I changed it for this question. 
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("output.txt"))); 

    String temp = ""; 
    //String cString = ""; 

    while(f.hasNextLine()) { 
     String cString = f.nextLine(); 
     temp += cString; 
    } 
    StringTokenizer everythingTokens = new StringTokenizer(temp); 
    String[] everything = new String[ everythingTokens.countTokens() ]; 

    for(int i = 0; i < everything.length; i++) { 
     everything[ i ] = everythingTokens.nextToken(); 
    } 

    int numberOfPeople = Integer.parseInt(everything[ 0 ]); // Line where exception occurs. 
    out.println(everything[ 0 ]); 

的錯誤信息是這樣的

Exception in thread "main" java.lang.NumberFormatException: For input string: "3monkeys" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:492) 
at java.lang.Integer.parseInt(Integer.java:527) 
at gift1.main(gift1.java:32) 
Java Result: 1 

這究竟是爲什麼以及如何解決呢?

回答

0

當你通過temp += cString將每一行追加到一個字符串時,你所擁有的是「3」+「猴子」,即「3monkeys」。你可以通過在每行之後加一個空格來解決這個問題。 temp += cString + " "

0

會發生什麼事是您連接3和猴子與這些

while(f.hasNextLine()) { 
    String cString = f.nextLine(); 
    temp += cString; 
} 

所以3monkeys要刪除的換行符

如果格式化輸入文件的臨時現在將包含使得每行是一個單獨的令牌,然後我不認爲你仍然需要tokenizer那裏你只需要添加cString到數組或更好地使用ArrayList,這樣你就不必介意數組的大小

1

StringTokenizer不用新行標記令牌

結果String中沒有換行符字符。要改變這種情況..

String eol = System.getProperty("line.separator"); 
... 
    temp += cString + eol; 

最終,我將取消該代碼並重新開始。

  1. 使用StringBuilder,而不是String +=
  2. 不過,爲何增加第一線爲String在所有如果它有望成爲一個整數?立即解析並忽略第一行讀取的String。因爲它跨平臺工作,是一種清潔的方式
+1

這應該被標記爲正確答案。 – Caten 2017-03-23 00:42:37