2011-01-21 15 views
5

我想通過URL上的InputStreamReader(到某些Apache服務器上的文件)上的InputStreamReader上使用BufferedReader從Web文檔中讀取文本。BufferedReader沒有說明'準備好'它應該

String result = ""; 
URL url = new URL("http://someserver.domain/somefile"); 
BufferedReader in = null; 
in = new BufferedReader(new InputStreamReader(url.openStream(), "iso-8859-1")); 

result += in.readLine(); 

現在,這工作得很好。但很顯然,我希望讀者不要只讀一行,而是儘可能多地閱讀文件。
望着的BufferedReader API下面的代碼應該做到這一點:

while (in.ready()) { 
    result += in.readLine(); 
} 

即當有更多的行時讀取所有行,當沒有更多的行時停止。此代碼不起作用,但 - 讀者只需從不報告ready()= true

我甚至可以在讀取一行(從文件中讀取正確的字符串)之前打印ready()值,但讀者將報告'false'。

我做錯了什麼?爲什麼BufferedReader返回'false'準備好時,實際上有東西要讀?

+0

我不知道它是否有任何重要性,但實際上URL指向使用HTTPS的位置。但是,證書正確地安裝在服務器和運行上述代碼的機器上。 readLine()也返回第一行,沒有問題。 – fgysin 2011-01-21 14:42:02

+0

當等待數據時它將準備就緒,但在執行讀取/讀取線路之前它不會等待數據。即使有數據等待,它可能不是一個完整的行,所以readLine()會阻止。 – 2011-01-21 14:51:25

+0

洛塔很好的答案,thx每一個。可悲的是我只能將其中一個標記爲已接受的答案。 :) – fgysin 2011-01-26 13:35:29

回答

7

就緒()!=有更多

ready()並不表示有要讀取更多的數據。它只顯示如果讀取 可以阻止該線程。在讀取所有數據之前,它很可能會返回false。

如果readLine()返回null以確定是否不再有數據檢查。

String line = in.readLine(); 
while(line != null){ 
    ... 
    line = in.readLine(); 
} 
4

你能做到這一點,繞過in.ready()另一種方法是這樣的:

while ((nextLine = in.readLine()) != null) { 
    result += nextLine; 
} 

你就繼續讀書,直到你完成。這樣您就不必擔心in.ready()的問題。

+0

我認爲你已經破壞了你的答案,使它聽起來像一個解決方法。你展示的是從BufferedReader中讀取最常見的習慣用法,但更重要的是,它是正確的。使用像OP這樣的`ready()`方法是**不正確。 – 2015-03-22 07:20:22

2

爲指定的BufferedReader.ready()方法表現:

Reader.ready() javadoc說以下內容:

[返回] true如果下read()不能保證以阻止輸入,否則爲false。請注意,返回false不能保證下一次讀取將被阻止。

然後BufferedReader.ready() javadoc說以下內容:

判斷此流是否已準備好被讀取。如果緩衝區不是空的,緩衝字符流就緒,或底層字符流準備就緒

如果你把這兩個在一起,很顯然,BufferedReader.ready()可以在可用字符的情況下返回false。總之,您不應該依賴ready()來測試邏輯文件結束或流結束。

0

這是我們一直使用多年的 - 不知道它是否是「標準」方法。我想聽聽關於直接使用URL.openURLStream()的優點和缺點的評論,以及是否導致OP的問題。此代碼適用於HTTP和HTTPS連接。

URL getURL = new URL (servletURL.toString() + identifier+"?"+key+"="+value);  
URLConnection uConn = getURL.openConnection(); 

BufferedReader br = new BufferedReader (new 
          InputStreamReader (uConn.getInputStream())); 
for (String s = br.readLine() ; s != null ; s = br.readLine()) { 
     System.out.println ("[ServletOut] " + s); 
     // do stuff with s 
}    
br.close(); 
0

基本上BufferedReader.ready()可以使用的方法來檢查底層流是否已準備好到方法調用者提供數據....否則我們可以等待線程一段時間,直到它準備好。

但真正的問題是,經過我們完全讀取數據流,它會拋出假.. 所以我們不知道流是否被完全讀取或底層流忙....

0

如果你想使用in.ready(),下面的工作對我很好:

for (int i = 0; i < 10; i++) { 
     System.out.println("is InputStreamReader ready: " + in.ready()); 
     if (!in.ready()) { 
      Thread.sleep(1000); 
     } else { 
      break; 
     } 
    }