2011-04-07 36 views
5

Trong nhiều năm tôi đã được đọc từ InputStreams trong một vòng lặp như thế này:Dòng đọc đầu vào thanh lịch hơn?

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

Nhưng tôi tự hỏi, nếu có một cách để tránh điều đó nhiệm vụ trong vòng lặp (không giới thiệu điều kiện thứ hai) - ví dụ mã này tôi xem xét thậm chí còn kém thanh lịch hơn vì có hai câu lệnh đọc và hai điều kiện:

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

Bất kỳ ý tưởng nào cho cấu trúc trang nhã hơn (nhỏ gọn, không có điều kiện) xây dựng?

+1

Không nên so sánh (r> = 0) thay vì (r> 0)? Kết thúc luồng được biểu thị bằng -1. – Leonel

Trả lời

5

bạn nghĩ gì về vấn đề này :

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

nó là nhỏ gọn và giữ phạm vi nhỏ nhất có thể đếm biến nhưng nó có thể được coi là ít có thể đọc

+0

Tôi thích nó, và không thấy bất kỳ vấn đề rõ ràng. Sẽ chắc chắn để thử nó. – Eugene

4

IMO, cái đầu tiên là tốt nhất và nhỏ gọn nhất. :)

2

làm {} khi() là xấu và không có nghĩa là thanh lịch.

Tôi thường làm điều này (không có bài tập trong điều kiện):

int count = stream.read(buffer); 

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

này có nhược điểm của dòng tương tự xảy ra hai lần, nhưng đó là tốt nhất mà tôi đã

+0

+1 cho đơn giản và rất dễ đọc. – jahroy

0

Tôi làm theo cách này nhưng ít nhiều giống nhau.

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(); 
    } 
Các vấn đề liên quan