Thoạt nhìn mã này dường như hoàn toàn OKjava.io.BufferedOutputStream có an toàn để sử dụng không?
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("1.txt"));
byte[] bytes = new byte[4096];
bout.write(bytes);
bout.close();
nhưng nếu chúng ta hãy xem xét kỹ hơn chúng ta sẽ thấy rằng close()
được thực hiện như sau
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
Có thể rằng do flush()
lỗi được bỏ qua dữ liệu có thể bị mất và chương trình sẽ không nhận thấy nó? Không có đề cập đến bất kỳ mối nguy hiểm nào trong số FilterOutputStream.close
(trong đó BufferedOutputStream
kế thừa close()
từ) API.
Cập nhật: Để mô phỏng lỗi IO trong khi đóng() tôi đã thay đổi thử nghiệm để ghi vào bộ nhớ Flash, thêm 5 giây trước khi bout.close() và trong khi thử nghiệm đang ngủ, tôi đã xóa Flash khỏi USB . Các thử nghiệm đã hoàn thành mà không có ngoại lệ, nhưng khi tôi chèn Flash và kiểm tra nó - 1.txt đã không có.
Sau đó, tôi gạt gần()
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("g:/1.txt")) {
@Override
public void close() throws IOException {
flush();
super.close();
}
};
và chạy thử nghiệm một lần nữa và đã
Exception in thread "main" java.io.FileNotFoundException: g:\1.txt (The system cannot the specified path)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
at test.Test1.main(Test1.java:10)
'FilterOutputStream' typo? –
Nó hiển thị như một lỗi trong phương thức 'close()' của openjdk. - Cửa hàng chết để bỏ qua ... –
@Nikolay Không phải của nó. BufferedOuptutStream kế thừa từ đó, quên đề cập đến –