2012-08-30 16 views
6

Đoạn mã này đang tạo ra sự cố rò rỉ bộ nhớ gây ra BufferedReaderInputStreamReader mà tôi cho rằng có thể xảy ra do một số ngoại lệ. Làm thế nào tôi nên thay đổi nó?Đóng BufferedReader và InputStreamReader

try{ 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    while ((str = in.readLine()) != null) { 
     jsonString += str; 
    } 
    in.close(); 
}catch(Exception e){ 

} 
+1

Có thể được di chuyển gần() logic để cuối cùng chặn? Bạn có chắc chắn không có trường hợp ngoại lệ xảy ra trong khi đọc (hoặc) đóng kết nối? – kosa

+0

Bạn đã cố gắng viết 'e.printStackTrace()' trong mệnh đề câu lệnh của mình để xem các trường hợp ngoại lệ có bị ném không? –

Trả lời

12

Sẽ an toàn hơn khi đóng luồng của bạn bằng khối try..finally. Bạn cũng có thể sử dụng một số StringBuilder vì nó được thiết kế để ghép các chuỗi. Bạn cũng nên tránh bị bắt Exception và không làm gì với nó. Ngoài ra, mã của bạn là ghép các dòng mà không có bất kỳ ngắt dòng nào. Điều này có thể cũng không phải là những gì bạn muốn, trong trường hợp append("\n") mà khi bạn đọc từng dòng trong

Dưới đây là một phiên bản với những thay đổi:.

StringBuilder json = new StringBuilder(); 
try { 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    try { 
     String str; 
     while ((str = in.readLine()) != null) { 
      json.append(str).append("\n"); 
     } 
    } finally { 
     in.close(); 
    } 
} catch (Exception e) { 
    throw new RuntimeException("Failed to read JSON from stream", e); 
} 
+0

Tôi có cần phải đóng InputStreamReader? Hoặc đóng cửa của nó như là bộ đọc đệm sẽ tạo ra một đối tượng mới? –

+4

Không cần đóng một cách rõ ràng 'InputStreamReader' vì nó sẽ tự động đóng khi bạn đóng' BufferedReader'. –

+0

@aetheria, cảm ơn bạn. Nhưng dù sao tôi cũng cần một hướng dẫn luồng Java tốt. –

5

Mã không đẹp nhưng sẽ không tạo rò rỉ bộ nhớ. Tôi đề nghị bạn sử dụng một bộ nhớ hồ sơ để xác định nơi bộ nhớ của bạn đang được sử dụng. Nếu không, bạn chỉ là đoán ngay cả khi bạn có mười năm kinh nghiệm + điều chỉnh hiệu suất trong Java;)

Một lựa chọn tốt hơn là sử dụng Java 7

URL url = new URL(sMyUrl); 
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} 

Nếu bạn có Java 6 hoặc cũ hơn, bạn có thể sử dụng.

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
try { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} finally { 
    in.close(); 
} 
+0

Hoàn toàn không có lợi ích trong việc thiết lập 'in = null' và sau đó kiểm tra null trong khối' finally'. Chỉ cần đặt 'try' ngay sau khi bạn xây dựng' BufferedReader'. –

+0

Cảm ơn! Tôi có cần đóng InputStreamReader không? –

+0

@aetheria Điểm tốt. Đang sửa. –