Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java IO Exception: Stream Closed

This is the code I currently have:

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

Everything works as expected (The file is written to when the writeToFile method is called). However when the writeToFile method is called a second time I get the following error:

    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) 

the file is still written to the second time as expected but it throws this error on the second and future calls to writeToFile(). I am wondering what is causing this error to happen.

like image 630
ez4nick Avatar asked Apr 06 '14 21:04

ez4nick


People also ask

How do I resolve Java IO IOException stream closed?

io. IOException: Stream closed Error by Creating a New Stream. The first solution is to create a new stream whenever we want to write to a specified file by moving the FileWriter object into the writeToFile() function.

What does stream closed mean?

Once a stream is closed, it can not be written to again.

What causes a Java IO exception?

Java IOExceptions are Input/Output exceptions (I/O), and they occur whenever an input or output operation is failed or interpreted. For example, if you are trying to read in a file that does not exist, Java would throw an I/O exception.

What throws IO exception?

It may occur due to the file deleted or viruses in the file. Sometimes BufferedReader takes data from a network stream where the reading system can fail at any time. So this type of error can occur in input operation when a BufferedReader is used. This is why a buffered reader throws IOException.


2 Answers

You're calling writer.close(); after you've done writing to it. Once a stream is closed, it can not be written to again. Usually, the way I go about implementing this is by moving the close out of the write to method.

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

And add a method cleanUp to close the stream.

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

This means that you have the responsibility to make sure that you're calling cleanUp when you're done writing to the file. Failure to do this will result in memory leaks and resource locking.

EDIT: You can create a new stream each time you want to write to the file, by moving writer into the writeToFile() method..

 public void writeToFile() {     FileWriter writer = new FileWriter("status.txt", true);     // ... Write to the file.      writer.close();  } 
like image 124
christopher Avatar answered Sep 21 '22 16:09

christopher


You call writer.close(); in writeToFile so the writer has been closed the second time you call writeToFile.

Why don't you merge FileStatus into writeToFile?

like image 24
NSF Avatar answered Sep 18 '22 16:09

NSF