2013-02-28 65 views
3

我無法看到下面的代碼有什麼問題。沒有時輸出空值。爲什麼我的Java BufferedReader在文件開始和結束時讀取空值?

輸出:null This is one. This is two. This is three. This is four five six. seven? null

文件的內容:

This is one. 
This is two. 
This is three. 
This is four 
five 
six. 
seven? 

任何幫助將不勝感激!

try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 

    String cLine=""; 
    while ((cLine = br.readLine()) != null) { 
     content+= cLine; 

    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.out.println(content); 
+0

顯示如何初始化內容,可能設置爲空 – 2013-02-28 20:19:48

+0

此外,更喜歡使用['StringBuilder'](http://docs.oracle.com/javase/ 6/docs/api/java/lang/StringBuilder.html)重複連接字符串。 – 2013-02-28 20:23:24

回答

7

我懷疑content爲空,開始與(而不是空的),它解釋了第一null。這並不能說明是最後一個,無可否認...我的猜測是,你實際上已經修正了一個錯誤,因爲你看到在年底與null輸出。如果不是這樣,你的文件實際上null底。 (我已經用content進行了測試,初始化爲「」,這很好。)

您是否知道您將刪除所有換行符,而不是用任何分隔符替換它們?因此,一個包含「x」,「y」和「z」行的文件將變成「xyz」。

此外,考慮使用StringBuilder而不是字符串連接 - 它會更有效,因爲它不需要始終複製字符串。

+0

只是想知道我自己的知識,如果BufferedReader檢測到回車符,它會返回null嗎?那麼,可能第二個null是'seven'下的空行嗎? – Chris 2013-02-28 20:33:24

+1

@ChristopherDay:Nope - 它會爲空行返回一個空字符串。它*只*在流尾部返回'null'。 – 2013-02-28 20:35:29

+0

謝謝您花時間回答。我知道這是關於主要問題的話題。 – Chris 2013-02-28 20:38:06

-2

如果開始了與Java,我建議喜歡使用掃描儀上的文件,而不是簡單的東西...。思考如下:

Scanner fileRead = new Scanner(fileName); 

while (fileRead.hasNextLine()) { 
    System.out.println(fileRead.nextLine()); 
} 

反正我的建議。

+2

這並沒有真正回答這個問題... – 2013-02-28 20:22:48

+0

如果他是在新的Java更容易更簡單的方法來啓動,它只是一個建議。如果是關於他的學習,而不僅僅是獲得答案,我會認爲它很有用。 – ObedMarsh 2013-02-28 20:35:26

0

只是一個評論...

我不知道try的這種語法。起初,我認爲這是一個錯字,但我發現它確實有效(我編譯並運行代碼)。

我想它總是: 嘗試{ .... .... .... }趕上(){}

上進一步閱讀,發現這是一個新的功能「試用資源」(來自Special syntax of java try catch block

相關問題