web-dev-qa-db-fra.com

java IO Exception: flux fermé

C'est le code que j'ai actuellement:

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

Tout fonctionne comme prévu (le fichier est écrit lorsque la méthode writeToFile est appelée). Cependant, lorsque la méthode writeToFile est appelée une seconde fois, l'erreur suivante apparaît:

    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)

le fichier est toujours écrit dans la deuxième fois comme prévu, mais cette erreur est générée lors du deuxième et des prochains appels à writeToFile (). Je me demande ce qui cause cette erreur.

22
ez4nick

Vous appelez writer.close(); après avoir écrit. Une fois qu'un flux est fermé, il ne peut plus être écrit. Habituellement, je mets en œuvre ceci en déplaçant la clôture de la méthode write to.

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

Et ajoutez une méthode cleanUp pour fermer le flux.

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

Cela signifie que vous avez la responsabilité de vous assurer que vous appelez cleanUp lorsque vous avez terminé d'écrire dans le fichier. Sinon, cela entraînera des fuites de mémoire et un verrouillage des ressources.

ÉDITER : Vous pouvez créer un nouveau flux à chaque fois que vous souhaitez écrire le fichier, en déplaçant writer dans la méthode writeToFile() ..

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

    writer.close();
 }
23
christopher

Vous appelez writer.close(); dans writeToFile de sorte que le rédacteur soit fermé la deuxième fois que vous appelez writeToFile.

Pourquoi ne fusionnez-vous pas FileStatus dans writeToFile?

3
NSF

N'appelez pas write.close() dans writeToFile().

2
cybersam