2014-04-06 1 views
11

이 내가 현재 가지고있는 코드입니다 : (파일은 writeToFile의 메서드를 호출 할 때 기록됩니다) 예상대로자바 IO 예외 : 스트림 청산

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

모든 것이 작동합니다. 그러나 writeToFile 방법 나는 다음과 같은 오류 얻을 두 번째로 호출 될 때 :

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) 

파일이 여전히 예상대로 두 번째 기록이지만() writeToFile에 두 번째와 미래의 통화에서이 오류가 발생됩니다. 이 오류의 원인을 궁금합니다.

+0

스택 트레이스의 첫 번째 줄에 'java.io.IOException : Stream closed'라고 표시됩니다. 그것을 닫은 다음 다시 쓸 수는 없습니다. – Keppil

답변

13

글을 쓰고 나면 writer.close();에게 전화 할 것입니다. 스트림을 닫으면 다시 쓸 수 없습니다. 보통, 이것을 구현하는 방법은 write to 메서드에서 close를 이동하는 것입니다.

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

그리고 cleanUp을 추가하여 스트림을 닫습니다.

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

당신이 파일에 작성을 완료 할 때 cleanUp를 호출하고 있는지 확인 할 책임이 있다는 것을 의미한다. 이렇게하지 않으면 메모리 누수와 리소스 잠금이 발생합니다.

편집 : 당신은 당신은 너무 writeToFile 작가에 writer.close(); 전화 ..

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

    writer.close(); 
} 
+0

'write.close()'를 호출하는 목적은 무엇입니까? 왜냐하면 나는 여러 번 파일에 쓸 수있는 옵션을 갖고 싶기 때문에 파일을 몇 번이나 쓸 지 예측할 수 없다면'write.close()를 호출 할 때 어떻게 알 수 있는지 보지 못한다. ' – ez4nick

+0

'write.close()'는 시스템에서 리소스를 해제합니다. 가능한 한 빨리이 작업을 수행해야합니다. 당신이 가진 한 가지 옵션은 쓰기를 원할 때마다 새로운 스트림을 열어서 매번 닫는 것입니다. 제 편집을 확인하십시오. – christopher

1

write.close()writeToFile()으로 보내지 마십시오.

1

을 당신이 writeToFile() 방법으로 writer를 이동하여 파일에 기록 할 때마다 새로운 스트림을 생성 할 수 있습니다 두 번째로 writeToFile에 전화하면 폐쇄되었습니다.

FileStatuswriteToFile에 병합 하시겠습니까?