2015-03-08 172 views
3

關於BufferedReader如何工作的非常基本的問題。鑑於字符串/短語,我想從文件中找到並打印大量文本。瞭解BufferedReader如何在Java中工作

using BufferedReader in Java我做了一些關於這個話題的研究,那是最接近的結果。雖然沒有完全解決我的問題。

因此,有了這些信息,爲什麼下面的代碼終止?

public class MainApp { 

String line = null; 
String phrase = "eye"; 

try { 
    File file = new File("text.txt"); 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 

    while((line = br.readLine()) != null) { 
     if (line.equals(phrase) { 
      System.out.println(line); 
      } 
     } 

    br.close(); 

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

我的這一塊應該如何工作的理解:

  • while循環經過文本的每一行,直到條件不再爲真
  • 每一行存儲在BufferedReader
  • Loop正在工作,直到的條件if(line.equals(phrase) if
  • 打印發現的短語。

爲什麼我認爲它可能工作:

  • readlines方法不作爲字符串存儲在的BufferedReader(因此他們不能相比)

  • 錯誤的邏輯(很可能是if語句)

爲了簡單起見,我們假設「的text.txt」充滿了很長的絕殺存有與單一「眼睛」字在它的中間放的地方。

問題到底在哪裏? (不提供整個代碼解決方案如果可能的話,我很樂意爲實踐的目的做編碼部分我自己)

+0

是什麼讓你認爲讀取行不是'字符串'? – 2015-03-08 17:37:26

+0

「readlines不作爲字符串存儲在BufferedReader中」。你究竟是什麼意思?你的意思是整行存儲在字符串中,而不是單詞,這就是爲什麼你不能比較這一行和短語? – CKing 2015-03-08 17:39:17

+0

由於「equals()」字符串方法在我的條件語句中起作用,我假設BufferedReader將讀取的行臨時存儲爲其他內容,然後將其轉換爲字符串。我對此的理解完全失效。我也忘了我將結果存儲在一個字符串變量本身。 – Lotix 2015-03-08 18:29:44

回答

3

您對此塊應該如何工作的理解:

  • while循環經過文本的每一行,直到條件不再爲真

正確:-)。

  • 每一行被存儲在的BufferedReader

不正確。 bufferedReader不存儲任何數據,它只是讀取它(這就是爲什麼它被稱爲bufferedReader)。當你打電話給br.readLine()時,它會給你一個帶有該行內容的字符串,但它本身不會存儲任何東西。在你的情況下,每行都存儲在line變量中,每次循環運行時都會覆蓋該變量。

  • 循環工作,直到的條件,如果(line.equals(短語)滿足。

不正確的。循環將繼續即使條件滿足工作。如果你想循環停止,你需要插入一條break語句,在你的情況下,當條件 met時,它將打印整行,循環將繼續。在你的情況下,語句可能永遠不會會遇到,因爲if (line.equals(phrase)可能永遠不會是真的。

  • 打印發現的短語。

可能,如果整個線等於短語。如果短語被其他單詞包圍,則條件(line.equals(phrase)將不成立。

爲什麼你認爲它可能工作:

  • readlines方法不存儲爲的BufferedReader(因此他們不能相比)字符串

如上所述,BufferedReader內沒有任何內容。您正在將每條線存儲在line變量中。然後,您將與line變量進行比較。

  • 錯誤的邏輯(最有可能的if語句)

是。 if陳述中的條件是錯誤的,因爲它檢查整行行是否與所需短語匹配。此外,即使找到該短語,循環也會繼續運行。

爲了簡單起見,我們假設「的text.txt」充滿了很長的絕殺存有與單一「眼睛」字在它的中間放的地方。

在這種情況下,您的代碼可能不會打印任何內容。

問題到底在哪裏?(如果可能,請不要提供完整的代碼解決方案,我希望自己爲了練習而自己編碼)

問題出在循環的條件。將鼠標懸停在這裏看到它應該如何:

if (line.contains(phrase))

而且,在循環中沒有break語句,所以它會多次打印語句,如果它存在於文件中。 (如果循環的條件是固定的!)

2

您需要使用line.contains方法,而不是線。您正在使用

if (line.contains(phrase)) { 

等於所以它是你在說什麼「錯誤的邏輯(最有可能的if語句)」

那麼你可以打印的行(或任何你想要做的)

System.out.println(s); 

如果線路如下:

Lorem ipsum dolor sit amet, **eye** consectetur adipiscing elit. 

它不會匹配雖然它包含了要捕捉..所以改變,如果我提到的,你是好去

1

您的代碼應該工作。 BufferedReader Class只是從流中讀取數據的緩衝區。這僅僅意味着它不會從文件中逐字節讀取(這將需要永久執行)。

BufferedReader Class將會從文件中讀取一個字節緩衝區(例如1024字節)。它會在緩衝區中尋找一個行分隔符(「\ n」)。如果沒有找到,字節將被追加到StringBuilder對象中,並且將獲取下一個緩衝區。這將發生,直到在緩衝區中找到行分隔符。緩衝區中的所有字節直到行分隔符將被追加到StringBuilder對象後,最後該字符串將返回給您。

編輯:根據實現,行分隔符可能包含或不包含在字符串中。其他人指出,但是,它會慢很多。如果要查找特定行,請使用equals()(在短語字符串中添加行分隔符)。如果你想在一行中找到特定的短語,那麼就是要走的路。

1

當你讀線也將包含行上的所有其他數據

some words eye some other words 

要正確地找到,如果該行包含「眼」你應該叫代替equals()

if (line.contains(phrase)) 
+0

從根本上說是錯誤的。 [documentation](http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine())明確指出,讀取的行將不包含行終止。 – 2015-03-08 20:04:00

+0

OP從他的答案中刪除了這個,所以你的評論有點混亂,並且與上下文不符。也許刪除它? – JonasCz 2015-03-10 19:35:22