2010-03-16 27 views
8

Tôi đã chờ đợi đoạn mã sau để ném một ngoại lệ khi tôi goto ghi dữ liệu vào Luồng:Java BufferedWriter, OutputStreamWriter thể viết thư cho FileOutputStream kín

File file = new File("test.txt"); 
FileOutputStream fs = new FileOutputStream(file); 
OutputStreamWriter ow = new OutputStreamWriter(fs); 
BufferedWriter writer = new BufferedWriter(ow); 

fs.close(); 

try { 
    ow.write(65); 
    writer.write("test"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Tôi nhận ra rằng tôi nên đóng BufferedWriter, nhưng trong môi trường hiện tại của tôi, nó có thể có thể cho FileOutputStream được đóng trước khi BufferedWriter được đóng lại. Không nên FileOutputStream được ném một IOException mà nên di chuyển lên chuỗi cho đến khi nó chạm vào khối try/catch của tôi và in dấu vết stack?

Nếu tôi cố gắng gọi fs.write (65), thì nó sẽ ném một ngoại lệ.

Trả lời

9

Thử xả nước sau khi thực hiện cuộc gọi. Luồng đệm có thể chưa cố gắng ghi nội dung vào luồng cơ bản, do đó không nhận ra rằng luồng cơ bản đã bị đóng.

CHỈNH SỬA:

Chỉ cần dùng thử. Với mã:

File file = new File("test.txt"); 
FileOutputStream fs = new FileOutputStream(file); 
OutputStreamWriter ow = new OutputStreamWriter(fs); 
BufferedWriter writer = new BufferedWriter(ow); 

fs.close(); 

try { 
    ow.write(65); 
    writer.write("test"); 
    writer.flush(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

bạn sẽ có được ngoại lệ sau đây:

java.io.IOException: Bad file descriptor 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:260) 
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) 
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) 
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276) 
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122) 
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212) 
    at java.io.BufferedWriter.flush(BufferedWriter.java:236) 
    at Test.main(Test.java:16) 
+1

Cảm ơn! Không thể tin rằng tôi đã không thử điều đó, Bài kiểm tra đơn vị khiến tôi tập trung, đôi khi tôi bỏ lỡ điều hiển nhiên. – craineum

+0

Tại sao nó không ném một ngoại lệ tại 'ow.write (65)', mặc dù? OutputStreamWriter không được đệm. –

+0

Nếu bạn đọc javadoc cho OutputStreamWriter (phần giới thiệu), bạn thấy rằng nó cũng được đệm. –

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