2014-04-06 27 views
11

Đây là mã Tôi hiện có:java IO Ngoại lệ: Suối Closed

public class FileStatus extends Status{ 
FileWriter writer; 
public FileStatus(){ 
    try { 
     writer = new FileWriter("status.txt",true); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

} 

public void writeToFile(){ 
    String file_text= pedStatusText + "  " + gatesStatus + "  " + DrawBridgeStatusText; 
    try { 
     writer.write(file_text); 
     writer.flush(); 
     writer.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

Mọi thứ hoạt động như mong đợi (Các tập tin được ghi vào khi các phương pháp writeToFile được gọi). Tuy nhiên khi các phương pháp writeToFile được gọi là lần thứ hai tôi nhận được lỗi sau:

java.io.IOException: Stream closed 
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135) 
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220) 
    at java.io.Writer.write(Writer.java:157) 
    at FileStatus.writeToFile(FileStatus.java:19) 
    at MenuBar$9.actionPerformed(MenuBar.java:115) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.AbstractButton.doClick(AbstractButton.java:376) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703) 
    at java.awt.EventQueue.access$000(EventQueue.java:102) 
    at java.awt.EventQueue$3.run(EventQueue.java:662) 
    at java.awt.EventQueue$3.run(EventQueue.java:660) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:676) 
    at java.awt.EventQueue$4.run(EventQueue.java:674) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:673) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 
java.io.IOException: Stream closed 
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135) 
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220) 
    at java.io.Writer.write(Writer.java:157) 
    at FileStatus.writeToFile(FileStatus.java:19) 
    at MenuBar$9.actionPerformed(MenuBar.java:115) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.AbstractButton.doClick(AbstractButton.java:376) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703) 
    at java.awt.EventQueue.access$000(EventQueue.java:102) 
    at java.awt.EventQueue$3.run(EventQueue.java:662) 
    at java.awt.EventQueue$3.run(EventQueue.java:660) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:676) 
    at java.awt.EventQueue$4.run(EventQueue.java:674) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:673) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 
java.io.IOException: Stream closed 
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135) 
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220) 
    at java.io.Writer.write(Writer.java:157) 
    at FileStatus.writeToFile(FileStatus.java:19) 
    at MenuBar$9.actionPerformed(MenuBar.java:115) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.AbstractButton.doClick(AbstractButton.java:376) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 

file vẫn ghi vào lần thứ hai như mong đợi nhưng nó ném lỗi này trên các cuộc gọi thứ hai và trong tương lai để writeToFile(). Tôi tự hỏi điều gì gây ra lỗi này xảy ra.

+0

Dòng đầu tiên của theo dõi ngăn xếp của bạn cho biết tất cả: 'java.io.IOException: Luồng đã đóng'. Bạn không thể đóng nó và sau đó viết lại nó. – Keppil

Trả lời

13

Bạn đang gọi writer.close(); sau khi bạn đã viết xong. Khi một luồng được đóng lại, nó không thể được viết lại. Thông thường, cách tôi đi về việc thực hiện điều này là bằng cách di chuyển từ viết ra thành phương thức.

public void writeToFile(){ 
    String file_text= pedStatusText + "  " + gatesStatus + "  " + DrawBridgeStatusText; 
    try { 
     writer.write(file_text); 
     writer.flush(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Và thêm phương thức cleanUp để đóng luồng.

public void cleanUp() { 
    writer.close(); 
} 

Điều này có nghĩa là bạn có trách nhiệm đảm bảo rằng bạn đang gọi cleanUp khi bạn viết xong tệp. Việc không thực hiện điều này sẽ dẫn đến rò rỉ bộ nhớ và khóa tài nguyên.

EDIT: Bạn có thể tạo một dòng mới mỗi khi bạn muốn ghi vào tập tin, bằng cách di chuyển writer vào phương pháp writeToFile() ..

public void writeToFile() { 
    FileWriter writer = new FileWriter("status.txt", true); 
    // ... Write to the file. 

    writer.close(); 
} 
+0

mục đích gọi 'write.close()' là gì? vì tôi muốn có tùy chọn ghi vào tệp nhiều lần nhưng nếu không thể dự đoán được bao nhiêu lần tệp sẽ cần được ghi vào Tôi không thấy bạn sẽ biết khi nào nên gọi 'write.close() ' – ez4nick

+0

' write.close() 'giải phóng tài nguyên trên hệ thống. Bạn nên làm điều này càng sớm càng tốt. Một tùy chọn bạn có là chỉ cần mở luồng mới mỗi lần bạn muốn viết và đóng mỗi lần .. Kiểm tra Chỉnh sửa của tôi. – christopher

1

Đừng gọi write.close() trong writeToFile().

1

Bạn gọi writer.close(); trong writeToFile nên nhà văn đã bị đóng lần thứ hai bạn gọi writeToFile.

Tại sao bạn không hợp nhất FileStatus vào writeToFile?