2011-04-07 83 views
5

多年來,我一直從InputStreams在這樣的循環讀取:更優雅的輸入流讀取循環?

final byte[] buffer = new byte[65536]; 
InputStream is = ...; 
int r; 
while ((r = is.read(buffer)) > 0) { 
    ... 
} 

但我不知道是否有一種方法來避免在循環中分配(不引入第二個條件) - 例如此代碼有兩個讀語句和兩個條件,我認爲更不優雅:

r = is.read(buffer); 
if (r > 0) { 
    do { 
     ... 
     r = is.read(buffer); 
    } while (r > 0); 
} 

任何想法更優雅(緊湊,沒有有條件分配)構建?

+1

不應該比較(r> = 0)而不是(r> 0)嗎?流結束由-1表示。 – Leonel 2011-04-07 18:42:03

回答

5

你怎麼看待這個什麼:

for (int count = stream.read(buffer); count >= 0; count = stream.read(buffer)) { 
    ..... 
} 

它是緊湊的並保持計數變量 的最小可能的範圍,而是可以考慮以下可讀

+0

我喜歡它,並沒有看到任何明顯的問題。一定會嘗試一下。 – Eugene 2012-09-19 17:13:56

4

IMO,第一個是最好的,最緊湊的。 :)

2

do {} while()是邪惡的,絕不是優雅的。

我通常這樣做(在條件語句不分配):

int count = stream.read(buffer); 

while (count >= 0) { 
    ... 
    count = stream.read(buffer); 
} 

此具有相同的線發生兩次的缺點,但是這是我得到

最好
+0

+1簡單直觀,非常易於閱讀。 – jahroy 2014-04-06 20:22:47

0

我這樣做,但它或多或少一樣。

InputStream input; 
    final int bytes = 100; 
    final byte[] bArray = new byte[bytes]; 
    input.read(bArray, 0, bytes); 

    int c = input.read(); 
    while (c >= 0) { 
     ............. 
     ............. 

     c = input.read(); 
    }