2011-09-08 25 views
14

Nhiều tài nguyên I/O trong Java như InputStream và OutputStream cần được đóng khi chúng được hoàn thành, như được thảo luận here.Làm cách nào để tìm tài nguyên I/O không được khai báo trong Java?

Tôi làm cách nào để tìm kiếm dự án của mình cho những địa điểm không bị đóng tài nguyên, ví dụ: loại lỗi này:

private void readFile(File file) throws IOException { 
    InputStream in = new FileInputStream(file); 
    int nextByte = in.read(); 
    while (nextByte != -1) { 
     // Do something with the byte here 
     // ... 
     // Read the next byte 
     nextByte = in.read(); 
    } 
    // Oops! Not closing the InputStream 
} 

Tôi đã thử một số công cụ phân tích tĩnh như PMD và FindBugs, nhưng chúng không gắn cờ mã ở trên là sai.

+3

FindBugs dường như có thể phát hiện ra điều này, mặc dù: http://stackoverflow.com/questions/2570820/findbugs-may-fail-to-close-stream-is-this-valid-in-case-of- inputstream – Thilo

+1

Âm thanh như bạn cần điều chỉnh quy tắc FindBugs kiểm tra –

Trả lời

1

Trong Java 7, họ thêm một tính năng của việc sử dụng các nguồn lực closable trong phạm vi hiện tại (cái gọi là thử-với-nguồn lực), chẳng hạn như:

public void someMethod() { 
    try(InputStream is = new FileInputStream(file)) { 
     //do something here 
    } // the stream is closed here 
} 

Trong phiên bản cũ, các kỹ thuật phổ biến được sử dụng try- bắt chuỗi cuối cùng.

+1

OK, vì vậy câu hỏi của tôi nói cách khác là trong Java 6 hoặc cũ hơn, làm cách nào tôi có thể tìm thấy các trường hợp không sử dụng kỹ thuật "thử rồi cuối cùng đóng"? –

+0

Google nói rằng FindBugs có thể tìm thấy loại lỗi như vậy –

5

Có thể là vấn đề của thiết lập - Tôi đã chạy FindBugs thông qua plugin IDE của mình và báo cáo OS_OPEN_STREAM.

+0

Bạn có thể xây dựng những gì cần phải thực hiện trong FindBugs không? IMO, điều này cần phải được kích hoạt theo mặc định, do các tác dụng phụ của sự cố ứng dụng khi nó chạy ra khỏi ulimit. – bram

6

Nếu FindBugs có quy tắc sửa đổi không hiệu quả với bạn, một cách tiếp cận chậm hơn là phân tích đống. VisualVM cho phép bạn truy vấn tất cả các đối tượng của một loại cụ thể được mở tại bất kỳ thời điểm nào trong vòng kết xuất đống bằng OQL. Sau đó, bạn có thể kiểm tra các luồng mở đối với các tệp không nên truy cập tại thời điểm đó trong chương trình.

Chạy nó cũng đơn giản như:

%>jvisualvm 

Chọn quá trình chạy. Chọn tùy chọn lưu heap dump (hoặc một cái gì đó để có hiệu lực đó), mở đống đống và nhìn vào trường hợp lớp cho các luồng tập tin trong trình duyệt, hoặc truy vấn cho họ.

Các vấn đề liên quan