2010-05-04 27 views
6

Trong trường hợp nào sẽ java.util.zip.ZipFile.close() ném một IOException? Chữ ký phương thức của nó chỉ ra rằng nó có thể được ném, nhưng từ mã nguồn thì dường như không có nơi nào mà điều này có thể xảy ra, trừ khi nó nằm trong mã gốc. Hành động khắc phục, nếu có, có thể được thực hiện tại thời điểm ngoại lệ bị bắt?khi nào java.util.zip.ZipFile.close() ném IOException?

Trả lời

7

Từ API docs on ZipFile.close():

Đóng file ZIP này sẽ đóng cửa tất cả các đầu vào trước suối trả về bởi lời gọi của phương pháp getInputStream.

InputStream.close() ném một số IOException, vì vậy ZipFile.close() cũng phải ném nó. Theo số API docs for InputStream.close(), nó ném một số IOException "nếu xảy ra lỗi I/O". Đó không phải là rất mô tả nhưng nó đúc một mạng lưới rộng. InputStreams có thể đại diện cho các luồng đến từ hệ thống tập tin, mạng, bộ nhớ, vv InputStreams có thể liên quan đến bộ đệm cần được xóa, ổ cắm cần được đóng, tài nguyên cần được giải phóng, khóa cần được giải phóng, vv. xảy ra vì nhiều lý do.

+0

Nếu ngoại lệ được ném vào một cuộc gọi read() hoặc write(), tôi có thể hiểu rằng việc đọc hoặc ghi không thành công. Nhưng nếu ngoại lệ được ném vào gần(), những gì đã thất bại? –

1

Từ người đàn ông gần (2):

Không kiểm tra giá trị trả lại gần() là một lỗi lập trình phổ biến nhưng vẫn nghiêm trọng. Có thể là các lỗi trên thao tác ghi trước (2) được báo cáo lần đầu tiên ở lần đóng cuối cùng(). Không kiểm tra giá trị trả lại khi đóng tệp có thể dẫn đến mất dữ liệu im lặng. Điều này đặc biệt có thể được quan sát với NFS và với hạn ngạch đĩa.

+2

Trong khi đóng một luồng chỉ đọc không thể ném, khung IO của java không thể kiểm tra vì nó không có kiểm tra tĩnh đọc và viết luồng. – Joshua

0

Tôi không chắc chắn nhưng tôi nghĩ IOException được ném khi một trong các sự kiện sau đây xảy ra:

  • Các file zip đã bị xóa bởi một cái gì đó/một người nào đó bên ngoài của ứng dụng.
  • Khi ổ đĩa có chứa các tập tin zip được gỡ bỏ/ngắt kết nối

Rất nhiều sự kiện có thể là lý do nhưng đó là những chỉ có hai tôi có thể nghĩ ra ngay bây giờ.

+0

Nhưng tại sao một trong hai điều kiện đó lại gây ra lỗi khi đóng một ZipFile chỉ đọc? – EJP

+0

Tôi đã không đề cập rằng đó là những điều kiện duy nhất để ném ngoại lệ. –

0

Các tài liệu cho ZipFile.close() nói:

Đóng file ZIP này sẽ đóng cửa tất cả các đầu vào suối trước đây được trả về bởi lời gọi của phương pháp getInputStream.

Có lẽ phương thức gốc close đang tiến hành đóng InputStream.

Phương thức close của InputStreamIOException làm ngoại lệ đã kiểm tra.

Nguyên nhân có khả năng nhất là ngoài điều kiện không gian trên hệ thống tệp nơi tệp zip đang được viết lỗi trong hệ thống tệp cơ bản. Trừ khi bạn có thể xác định nguyên nhân và làm việc xung quanh nó trên bay, tất cả những gì bạn có thể làm là báo cáo điều kiện cho người dùng.

+0

Khi sử dụng 'InputStream', bạn đang * đọc *, chứ không phải * ghi *, do đó hết dung lượng đĩa do tệp zip được ghi không thể là nguyên nhân của' IOException' trong hoàn cảnh của cuộc thảo luận này . – Asaph

+0

Cảm ơn, đã sửa. –

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