2011-11-04 76 views
1

我創建了一個用Java讀取文件的方法。問題文件包含以下格式的書籍列表:姓氏|名字|標題。但是,當我嘗試使用該方法時,我收到一條錯誤消息。我的方法如下:Java - 讀取問題txt.file

private final static char END_SIGN = '|'; 

void readBookFile(String readFile) { 
     try { 
      FileReader textFileReader = new FileReader(readFile); 
      BufferedReader textReader = new BufferedReader(textFileReader); 

      int numberOfBooks = Integer.parseInt(textReader.readLine()); 

      for (int i = 0; i < numberOfBooks; i++) { 
       String post = textReader.readLine(); 

       int index1 = post.indexOf(END_SIGN); 
       int index2 = post.indexOf(END_SIGN, index1 + 1); 

       String lastname = post.substring(0, index1); 
       String firstname = post.substring(index1 + 1, index2); 
       String title = post.substring(index2 + 1); 

       Book book = new Book(lastname, firstname, title); 

       addBook(book); 
      } 

      tekstReader.close(); 
     } 
     catch (IOException exception) { 
      System.out.print("Wrong file reading: " + exception); 
      System.exit(1); 
     } 
    } 

當我試圖運行這個方法我收到錯誤消息:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Twain|Mark|The Adventures of Huckleberry Finn" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at Library.readBookFile(Library.java:36) 
    at LibraryTest.main(LibraryTest.java:8) 

36行是我找出整數NUMBEROFBOOKS方法的一部分。所以顯然這不是出於某種原因。如果有人知道可能會導致這種情況,我將不勝感激!

+1

5個答案在60秒內。哇。 –

+0

建議:永遠不要在默認包中放置任何類。總是把你的類放在一個定義良好的包中(package com.yourcompany.yourproject.somepackage)。 –

+0

也許你會想在開頭添加行數作爲自己的行? –

回答

3

,而不是驗證碼:

int numberOfBooks = Integer.parseInt(textReader.readLine()); 

for (int i = 0; i < numberOfBooks; i++) { 
    String post = textReader.readLine(); 

    int index1 = post.indexOf(END_SIGN); 
    int index2 = post.indexOf(END_SIGN, index1 + 1); 

    String lastname = post.substring(0, index1); 
    String firstname = post.substring(index1 + 1, index2); 
    String title = post.substring(index2 + 1); 

    Book book = new Book(lastname, firstname, title); 

    addBook(book); 
} 

試試這個:

String post = textReader.readLine(); 
while (post != null) { 
    int index1 = post.indexOf(END_SIGN); 
    int index2 = post.indexOf(END_SIGN, index1 + 1); 

    String lastname = post.substring(0, index1); 
    String firstname = post.substring(index1 + 1, index2); 
    String title = post.substring(index2 + 1); 

    Book book = new Book(lastname, firstname, title); 

    addBook(book); 
    post = textReader.readLine(); 
} 

而且,就像Jon Skeet所說的那樣,你應該重新安排你的代碼,以確保即使輸入處理拋出異常,輸入也是關閉的。 (A try ... finally結構對此很有用。)

+0

打我吧!解決方案,而不是工作更有幫助++ –

+0

太棒了!這工作!並感謝與終於構建的提示。但是,現在我似乎在後來的代碼中收到了不同的錯誤消息。將嘗試修復它自己雖然:)。非常感謝! – Kristian

4

顯然文件的第一行不是一個數字 - 它是錯誤消息中顯示的行。你需要檢查你的文件。

其他一些注意事項,但:

  • 你通常應該關閉你的讀者在finally
  • 你應該幾乎從未使用平臺的默認編碼,這是所有FileReader支持,使它一種最沒用的類型。相反,創建一個FileInputStream並將其包裝在InputStreamReader中,指定編碼。

Guava使這一切更容易與它Files類:

List<String> lines = Files.readLines(new File(readFile), Charsets.UTF_8); 
// All the IO is now done... 
+0

像這樣使用Guava的唯一缺點是整個文件需要一次駐留在內存中。一次處理一條生產線的流式處理方法可以大大節省空間。 –

+0

@TedHopp真的,在這種情況下,番石榴有'T Files.readLines(文件,字符集字符集,線處理器)':) –

5
int numberOfBooks = Integer.parseInt(textReader.readLine()); 

readLine()這裏返回文本文件的第一行的文本。第一行似乎是Twain|Mark|The Adventures of Huckleberry Finn,而不是文件中有多少本書的計數。

你在期待文件的第一行是什麼?

+0

謝謝。你是對的,該文件的第一行是馬克吐溫書。我發現這顯然會導致現在的錯誤。你有沒有機會知道如何讓方法讀取txt.file中的行數?我想避免只輸入for循環中的行數,因爲不同的文件可能有不同的行數。 – Kristian

+0

@Kristian我會看另一個問題:http://stackoverflow.com/questions/688431/what-is-the-fastest-way-to-find-out-how-many-non-empty-lines-are -in-a-file-usin –

+0

Alex:感謝您的鏈接!將看看它。非常感謝! – Kristian

4

您正在閱讀的行不是數字。這是一本書的名字,所以當它試圖將其作爲數字閱讀時,它會給出錯誤。當你看看你的輸入文件時,你確定它開頭的行數是?

+0

謝謝。我發現這顯然會導致現在的錯誤。你有沒有機會知道如何讓方法讀取txt.file中的行數?我想避免只輸入for循環中的行數,因爲不同的文件可能有不同的行數。 – Kristian

+0

由於其他答案可能已經清楚了,如果一個文件沒有告訴你線條的數量,那麼使用while循環讀取文件比直接用完線條更容易,而不是使用需要知道的for循環有多少條線路。 –

+0

是的。這真的很有幫助!我非常感謝:) – Kristian

2

該代碼假定文件以整數開頭,即第一行中單獨的書籍數量。顯然這不是在你的數據文件中。

1
int numberOfBooks = Integer.parseInt(textReader.readLine()); 

是textReader.readLine()返回(字符串)不是一個數字,因爲它返回的行:

"Twain|Mark|The Adventures of Huckleberry Finn" 
2

錯誤已經說明了:你可以不出來的創造一個整數字符串:「Twain | Mark |哈克貝利芬歷險記」:這不是一個數字表達式。

1

鑑於「有問題的文件包含以下格式的書籍列表:姓氏|名字|標題。」

在for循環之前,您嘗試int numberOfBooks = Integer.parseInt(textReader.readLine());這會引發異常,因爲它無法轉換|將字符串分隔爲整數。

假設每行1本書,圖書的數量是行的總數...