2011-02-23 11 views
20

Tôi đang làm việc như một thực tập sinh trong Test Automation. Tôi đang làm việc với việc tạo mã Junit với Eclipse và chạy bằng Eclipse. Trong đó tôi đang lấy lại dữ liệu từ excel bằng cách sử dụng chức năng FileInputStream.Tôi có phải đóng FileInputStream không?

FileInputStream fi=new FileInputStream("c:\\search.xls"); 
Workbook w=Workbook.getWorkbook(fi); 
Sheet s=w.getSheet(0); 

Có cần đóng chức năng Inputstream không? Nếu có, vui lòng hướng dẫn tôi một số mã.

Trả lời

22

Có, bạn cần phải close luồng đầu vào nếu bạn muốn tài nguyên hệ thống của mình được phát hành trở lại.

FileInputStream.close() là những gì bạn cần.

7
FileInputStream fi=null; 
try { 
    fi=new FileInputStream("c:\\search.xls"); 
    Workbook w=Workbook.getWorkbook(fi); 
    Sheet s=w.getSheet(0); 
} finally { 
    if (fi!=null) { 
     fi.close(); 
    } 
} 
+4

Chỉ cần một chú thích nhỏ - bạn cũng cần bọc câu lệnh 'close()' với một try/catch khi 'close()' khai báo để ném một IOException đã kiểm tra. Trong thực tế, bạn không thể sử dụng cuối cùng như thế. Bạn chỉ có thể thử/cuối cùng với các ngoại lệ thời gian chạy. Nhưng với các ngoại lệ được kiểm tra như IOException và các lớp con của nó, bạn phải có một try/catch hoặc try/catch/finally ... nó sẽ không biên dịch chỉ với try/finally. –

+2

Phụ thuộc vào việc IOException được khai báo cho phương thức hay không. Nếu bạn bắt được nó, bạn nên biết phải làm gì với nó. Phần quan trọng là đặt đóng() trong một khối cuối cùng. Trong thực tế, việc xử lý tự động điều này là một trong những tính năng mà tôi thực sự mong chờ được thấy trong Java 7. – Axel

6

Bạn cần phải đóng() hoặc kết thúc chương trình của mình.

Tuy nhiên bạn có thể chạy vào các vấn đề khó hiểu nếu bạn không đóng tập tin như

  • đôi khi thử nghiệm đang chạy riêng lẻ hoặc một nhóm thử nghiệm đang chạy trong quá trình tương tự. (Vì vậy, bạn có thể có một bài kiểm tra mà làm việc một cách nhưng không phải là khác)
  • bạn không thể đổi tên hoặc xóa một tập tin mở.

Cách tốt nhất là luôn đóng tài nguyên mà bạn đã hoàn thành, tuy nhiên tôi thấy các bài kiểm tra đơn vị dưới dạng tập lệnh không phải lúc nào cũng phải tuân theo phương pháp hay nhất.

-1

Basic CompSci 101 yêu cầu chúng tôi đảm bảo đóng tài nguyên mà chúng tôi mở, bằng Java hoặc bất kỳ ngôn ngữ nào. Vì vậy, có, bạn cần phải đóng chúng. Juju xấu nhất định sẽ xảy ra khi bạn không làm như vậy.

Ngoài ra, bạn nên tìm hiểu (và có độ nghiêng) để sử dụng Javadocs. Tra cứu Javadoc cho FileInputStream và Closeable. Câu trả lời là có.

+2

Đó là cách tiếp cận thực sự khủng khiếp để làm theo một cách mù quáng tuân theo các quy tắc đã thiết lập mà không bị chỉ trích và hiểu rõ phần * tại sao? *. * Những điều tồi tệ sẽ xảy ra * - oh phổ biến ?! Lập trình không phải là một ma thuật voodoo, mà không nhắc đến hậu quả (** không thể di chuyển được, nói chung, rò rỉ bộ nhớ có thể được giới thiệu, [os pool của các tập tin xử lý có thể bị cạn kiệt] (https://stackoverflow.com/questions/ 1661322/quá nhiều-mở-file-xử lý) **) của các nguồn tài nguyên không giải phóng đúng cách câu trả lời của bạn là vô dụng và có hại hơn. ** Downvoted. ** –

+1

Oooo, tôi sử dụng một hình thức nói và bạn đi "ZOMG anh ấy tin vào voodoo" (trái ngược với "hhhh, anh ta không đánh vần nó ra và chọn cho một số tiếng địa phương." Có một khá một vài câu trả lời khác không đánh vần hậu quả, và trừ khi bạn đi ra ngoài để phủ nhận chúng, bạn chỉ đơn giản là leo một loạt các hộp xà phòng trên một con ngựa cao thành kiến ​​Tại sao tôi không đánh vần các vấn đề (và tại sao nhất những người trong chủ đề này đã không) Bởi vì họ rất dễ dàng để tìm các tài liệu thích hợp, có sẵn cho bất cứ ai làm một modicum của nghiên cứu.Bạn lựa chọn nếu bạn thấy rằng không phù hợp. –

5

Nó luôn luôn là một ý tưởng tốt để đóng tài nguyên mà bạn sử dụng, NHƯNG:

Nếu bạn sử dụng tài nguyên Một trong nguồn B, đó là hợp lý để đóng B thay vì Một nếu nó có một phương pháp cho nó.

Trong trường hợp của bạn, bạn sử dụng FileInputStream trong Workbook, vì vậy bạn muốn tốt hơn để đóng Workbook và dựa vào Workbok rằng nó sẽ đóng FileInputStream.

Trong trường hợp đặc biệt này, trên thực tế, Workbookwill closeFileInputStream ở phần cuối của phương pháp getWorkbook() nhưng nó vẫn là một ý tưởng tốt để closeWorkbook để có thể được thu gom rác.

3

Có! bạn nên luôn luôn phát hành các tài nguyên một lần sau khi bạn đã làm xong với chúng. Java có một cơ chế mạnh mẽ cho Garbage Collection (lưu ý rằng nó khác so với quản lý tài nguyên/rò rỉ.) Vì vậy, một nhà sưu tập rác không thể xác định rằng nếu bạn cần tài nguyên trong tương lai hay không? Không phát hành tài nguyên có thể gây ra các vấn đề như - Từ chối dịch vụ, hiệu suất kém.

Như đã trả lời nhưng nỗ lực khác ít cách là try with resources

try (FileInputStream fi = new FileInputStream("c:\\search.xls")) { 

     //do something with fi. 
     //fi.getChannel() ; 

    } catch(IOException e) { 
     // exception handling. 
    } finally { 
    // some statements for finally. 
    } 

Bây giờ bạn không cần phải dứt khoát gọi phương thức fi.close().

0

Gần đây, khi tôi cố gắng cấu trúc lại mã của mình, tôi phải di chuyển việc tạo sổ làm việc sang một phương thức khác và FileInputStream được tạo trong phương thức đó. Phương thức đó tạo ra một FileInputStream và trả về một Workbook. Nhưng FileInputStream không hiển thị từ phương thức chính; Vậy làm cách nào để đóng FileInputStream ở cuối phương thức chính? Câu trả lời là, bạn không phải đóng FileInputStream, thay vào đó bạn chỉ cần đóng sổ làm việc, trong đó đóng nội bộ FileInputStream. Trong ngắn hạn, nó không chính xác để nói rằng bạn phải đóng FileInputStream không có vấn đề gì.