2013-10-20 48 views
1

我的程序需要讀取.txt文件並將其存儲到Arraylist中。如何跳過java中的NULL行?

不過的readLine()停止在完成A,B後閱讀,並得到了錯誤(讀Blankline一切返回NULL時,得到了出站除外)

.txt文件

一個 乙

Ç

d Ë

其是否可以讀取,跳過空白線,再次閱讀,檢測空白線,並再次跳過......

public static void loadData(){ 
    try{ 
     BufferedReader rd = new BufferedReader (new FileReader("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt")); 

    while(true){ 

     String myLine = rd.readLine(); 
     String fName = myLine.substring(0,myLine.indexOf("->",0)); 
     String toName = myLine.substring(myLine.indexOf("->")+3); 

     if(!myMap.containsKey(fName)){ 
      ArrayList<String> myArray = new ArrayList<String>(); 
      myMap.put(fName,myArray); 
     } 
     myMap.get(fName).add(toName); 
     allPlaces.add(fName); 

     if(rd.readLine()== null) { myLine = rd.readLine(); 
     } 
    } 
    } 

    catch(IOException ex){ 
     throw new ErrorException(ex); 
    } 
} 
+8

nitpick:一個'null'的字符串與空字符串不是一回事。 –

回答

1

是的,這是可能的。但你的例外不是來自這個。它來自null,應用於indexOf()(請參閱您的異常堆棧跟蹤,READ IT,這是您可以跟蹤錯誤的寶貴資源)。您錯誤地使用readLine()。這個:

if(rd.readLine()== null) { myLine = rd.readLine(); 
} 

會丟掉每一個奇數行。您不能通過調用readLine()來檢查null。相反,您應該在循環中調用readLine()一次,並檢查其返回值爲null。只有當它不爲空時,你才應該做進一步的處理。

+0

'會讀取I/O緩衝區'是什麼意思? – EJP

+0

@EJP:我的意思是,它不會檢查下一行是什麼,就像AFAIU OP所期望的那樣,而且還會讀取它。 – LeleDumbo

+0

換句話說,你的意思是它會拋棄線條?你的回答並不是這樣說的。所有I/O都讀取I/O緩衝區,只要這意味着任何事情。 – EJP

1

由於任何內容爲空,您沒有得到異常。但由於這一行

String fName = myLine.substring(0,myLine.indexOf("->",0)); 

as,myLine.indexOf("->",0)返回-1,所以substring方法拋出異常。修改此代碼以使其工作。

並且不要使用while(true),它將永遠在while循環中。使用

while(rd.readLine() != null) 

改爲。

+0

所有完成的是拋出每一個奇數行,並沒有真正解決問題。 – EJP

3

試用Scanner。這是一個容易得多:

Scanner scanner = new Scanner(new File("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt"); 
while (scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    if (!line.equals("")) { 
    //do stuff with the line since it isn't blank 
} 

這樣,你繼續讀,直到文件的末尾,你只能做的東西與不空行。

您可能還想考慮通過諸如line.replaceAll("\\s+", "");之類的東西來運行該行,以確保空白行真正爲空並且沒有其他空白字符。

2

Java中沒有'空行'。如果readLine()返回null這意味着流的結束,您必須在每次調用它時檢查它,以及是否關閉流並停止讀取。你的循環應該看起來像這樣:

while ((line = in.readLine()) != null) 
{ 
    // ... 
} 
in.close(); 

也沒有'出站異常'這樣的事情。你的意思是ArrayIndexOutOfBoundsException?NullPointerException?