2012-07-26 29 views
13

Ứng dụng của tôi ghi nhiều byte liên tục vào một tệp. Nếu một khối mã của tôi là viết ra byte và nhận được một IOException nếu kết nối với ổ đĩa hoặc mạng bị mất như thế nào tôi biết có bao nhiêu byte nó đã viết?Xử lý ngoại lệ IO trong khi ghi tệp bằng java

Ví dụ tôi đang viết 2500 byte tại một thời điểm và nếu một IOException xảy ra không có nghĩa là nó đã viết gì cho tệp hoặc nó sẽ ghi một phần byte vào tệp? Nếu byte một phần được ghi vào tập tin làm thế nào tôi biết bao nhiêu được viết

FYI Tôi đang sử dụng

DataOutputStream 

để viết ra tập tin. Tôi chỉ xả khi ứng dụng của tôi đóng.

+0

Bạn đang sử dụng phương pháp nào để ghi vào tệp? Tôi khá chắc chắn một cái gì đó giống như một BufferedOutputStream sẽ cung cấp cho bạn một kết quả khác nhau từ chỉ là một OutputStream. – xthexder

+0

bạn cũng có thể kiểm tra http://stackoverflow.com/questions/1742361/flush-in-java-io-filewriter, điều này cũng có thể giúp bạn – MaVRoSCy

Trả lời

6

Bạn không thể, IOException có thể xảy ra bất cứ lúc nào. Nếu bạn nghĩ về nó, IOException có thể do lỗi phần mềm hoặc phần cứng bất kỳ lúc nào, trước khi byte đầu tiên được viết, sau khi tất cả được viết nhưng có điều gì đó đã xảy ra với kết nối - hoặc ở giữa nếu đoạn dữ liệu khá lớn.

Sau khi kết nối lại, bạn phải kiểm tra kích thước tệp hoặc sử dụng một số kỹ thuật khác để giữ cho tệp ở trạng thái nhất quán và khôi phục. Lưới an toàn đơn giản nhất: đọc kích thước tệp trước khi ghi dữ liệu và lưu trữ dữ liệu một cách đáng tin cậy, ghi dữ liệu và đọc kích thước tệp sau khi viết. Nếu lỗi xảy ra và kích thước tệp hiện tại không bằng kích thước tệp dự kiến ​​(được lưu lần cuối), hãy cắt bớt byte bổ sung và thử lại.

Đọc về nhật ký giao dịch trong cơ sở dữ liệu quan hệ để xem phần mềm lớn và đáng tin cậy xử lý các trường hợp như thế nào.

1

Nó phụ thuộc vào cách thức ghi thất bại, nhưng InterruptedIOException có thể là những gì bạn đang tìm kiếm:

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InterruptedIOException.html

Nó chứa một lĩnh vực cho "bytesTransferred": "Báo cáo có bao nhiêu byte đã được chuyển giao như một phần của hoạt động I/O trước khi nó bị gián đoạn. "

+0

Đây là loại ngoại lệ mà tôi đang tìm kiếm, tôi sẽ thử nghiệm và báo cáo lại nếu thử bắt công trình !! Cảm ơn – Vig

+0

Có thể. Nhưng đó là cho mỗi hoạt động IO, và không phải toàn bộ chuyển giao nếu tôi không nhầm ... –

+0

Ngoại lệ đó chỉ áp dụng nếu luồng bị gián đoạn, không phải nếu có vấn đề I/O thực sự như OP đang hỏi. – EJP