2014-04-06 26 views
11

Bu benim şu anda sahip kodudur: (dosya WriteToFile yöntemi çağrıldığında yazılır) beklendiği gibijava IO İstisna: Akış Kapalı

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(); 
    } 
} 
} 

Her şey çalışır. Ancak WriteToFile yöntemi aşağıdaki hatayı alıyorum ikinci kez çağrıldığında:

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) 

dosya hala beklendiği gibi ikinci kez yazılır ama() WriteToFile ikinci ve gelecekteki çağrılarda bu hatayı atar edilir. Bu hatanın gerçekleşmesine neyin sebep olduğunu merak ediyorum.

+0

Yığın izinizin ilk satırı herşeyi belirtir: 'java.io.IOException: Aktarım kapalı '. Onu kapatamaz ve tekrar yazamazsın. – Keppil

cevap

13

Yazmayı tamamladıktan sonra writer.close(); numaralı telefonu arıyorsunuz. Akış kapatıldıktan sonra tekrar yazılamaz. Genellikle, bunu uygulamaya koyduğum yol, yazım yöntemini kapatmaktan vazgeçerek. Akışı kapatmak için cleanUp yöntemini ekleyin ve .

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

Bu

Eğer dosyaya yazma bittiğinde size cleanUp aradığınız emin olmak için sorumlu oldukları anlamına gelmektedir. Bunu yapmamak, bellek sızıntılarına ve kaynak kilitlenmesine neden olacaktır.

DÜZENLEME: Sen Çok writeToFile yazar içinde writer.close(); diyoruz ..

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

    writer.close(); 
} 
+0

'write.close()' işlevinin amacı nedir? çünkü dosyaya birden çok kez yazma seçeneğine sahip olmak istedim, ancak dosyanın kaç kez yazılacağını tahmin edemezsem ne zaman yazacağımı bilmiyorum ne zaman 'write.close()' i ne zaman arayacağımı bilemezsiniz ' – ez4nick

+0

' write.close() ', sistemdeki kaynağı serbest bırakır. Bunu en kısa zamanda yapmalısın. Bir seçenek, yazmak istediğiniz her seferinde yeni bir akış açmanız ve her seferinde kapatmanızdır. Düzenlememi kontrol et. – christopher

1

writeToFile()'da write.close()'u arama.

1

Eğer writeToFile() yöntem haline writer hareket ettirerek, dosyaya yazmak istiyorum her zaman yeni bir akış oluşturabilir writeToFile'u aradığınızda ikinci kez kapatıldı.

Neden FileStatus'u writeToFile içine birleştirmiyorsunuz?