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.
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();
}
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
?
N'appelez pas write.close()
dans writeToFile()
.