2014-04-06 14 views
11

Questo è il codice ho attualmente:java IO Eccezione: Flusso chiuso

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

Tutto funziona come previsto (Il file viene scritto quando il metodo writeToFile si chiama). Tuttavia quando il metodo writeToFile viene chiamato una seconda volta ricevo il seguente errore:

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) 

il file è ancora scritta per la seconda volta, come previsto, ma si getta questo errore sul secondo e future chiamate a writeToFile(). Mi chiedo cosa stia causando questo errore.

+0

La prima riga della traccia dello stack dice tutto: 'java.io.IOException: flusso chiuso'. Non puoi chiuderlo e poi scriverci di nuovo. – Keppil

risposta

13

Stai chiamando writer.close(); dopo aver scritto. Una volta che un flusso è chiuso, non può essere scritto di nuovo. Di solito, il modo in cui realizzo questo è spostando la chiusura del metodo di scrittura.

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

E aggiungere un metodo cleanUp per chiudere il flusso.

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

Questo significa che si ha la responsabilità di assicurarsi che si sta chiamando cleanUp quando hai finito di scrittura nel file. In caso contrario, si verificheranno perdite di memoria e il blocco delle risorse.

EDIT: è possibile creare un nuovo flusso di ogni volta che si desidera scrivere sul file, spostando writer nel metodo writeToFile() ..

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

    writer.close(); 
} 
+0

quale è lo scopo di chiamare 'write.close()'? perché mi piacerebbe avere la possibilità di scrivere sul file più volte, ma se non può essere previsto quante volte il file dovrà essere scritto non vedo come si dovrebbe sapere quando chiamare 'write.close() ' – ez4nick

+0

' write.close() 'rilascia la risorsa sul sistema. Dovresti farlo il prima possibile. Un'opzione che hai è semplicemente aprire un nuovo flusso ogni volta che vuoi scrivere e chiuderlo ogni volta. Controlla la mia modifica. – christopher

1

Non chiamare write.close() in writeToFile().

1

Si chiama writer.close(); nel writeToFile così lo scrittore è stato chiuso la seconda volta che chiami writeToFile.

Perché non si unisce FileStatus in writeToFile?

Problemi correlati