2017-04-21 160 views
0

我目前正在做一个Java项目拼贴,我已经骑到一个问题的位,并希望你们中的一个可以照亮我看不到的东西。以下是我用于将一个Array []写入文件的代码。该阵列本身是[100]。我遇到的问题是我无法理解堆栈告诉你什么或如何解决问题并阻止它。它被调用的文件已被另一类创建的,我已经检查,以确认它写入文件,流关闭错误,Java

public void writeGridToFile() throws IOException { 
      FileWriter fw = new FileWriter("D:/GridArrayFile.txt"); 
      try { 
       for(int i = 0; i < 100; i++){ 
        BufferedWriter bw = new BufferedWriter(fw); 
        bw.write(GridArray[i]); 
        bw.close(); 
       } 
      } 

      catch (IOException e) { 
       e.printStackTrace(); 
       System.out.println("Error"); 
      } 
      finally { 
       //TODO 
       System.out.println("Finished"); 
      } 
    } 

这是正在打印

java.io.IOException: Stream closed 
at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source) 
at sun.nio.cs.StreamEncoder.write(Unknown Source) 
at java.io.OutputStreamWriter.write(Unknown Source) 
at java.io.BufferedWriter.flushBuffer(Unknown Source) 
at java.io.BufferedWriter.close(Unknown Source) 
at playgame.writeGridToFile(playgame.java:195) 
at playgame.CreateFile(playgame.java:183) 
at playgame$1.actionPerformed(playgame.java:73) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

希望你能找到问题的异常堆栈,也可作为一边注意,如果这是一个简单的快速让我离开我只用了约一年半的Java和它对我来说仍然是非常新的。

+2

您正在关闭循环中的'BufferedWriter',然后关闭底层的'FileWriter' ...因此在下一次迭代中'FileWriter'被关闭。 –

+0

作为旁注:'尝试(BufferedWriter bw = new BufferedWriter(new FileWriter(“D:/GridArrayFile.txt”))){...您的代码}'是java 7+的方法, 每个情况下,异常或正常完成,流将被关闭 – SomeJavaGuy

+0

@SomeJavaGuy谢谢,也得到代码工作以及。我遇到的唯一问题是输出的文件内容与数组内部的数据完全不同。有任何想法吗? –

回答

0
public void writeGridToFile() throws IOException { 
     FileWriter fw = new FileWriter("D:/GridArrayFile.txt"); 
     BufferedWriter bw = new BufferedWriter(fw); 
     try { 
      for(int i = 0; i < 100; i++){ 
       bw.write(GridArray[i]); 
      } 
     } 
     catch (IOException e) { 
       e.printStackTrace(); 
       System.out.println("Error"); 
     } 
     finally { 
       bw.close(); 
       System.out.println("Finished"); 
     } 
} 
+0

嗨,谢谢你也解决了期望问题,但文件中的输出看起来像''这是奇怪的,因为数组的值是0或1,但没有数字正在显示。 –

+0

'GridArray'包含什么类型的值? – ShahzadIftikhar

+0

int [] GridArray = new int [100];它只保存int,它们主要由1和0构成 –

0

您的循环中的语句:

bw.close(); 

将关闭FileWriter fw为好。也许你正在寻找这样的东西?

public static void main(String[] args) 
throws IOException { 
    int[] gridArray = new int[] { 'H', 'u', 'r', 'r', 'a', 'y', '!' }; 
    try (FileWriter fw = new FileWriter("gridArrayFile.txt")) { 
     BufferedWriter bw = new BufferedWriter(fw); 
     for (int i = 0; i < gridArray.length; i++) { 
      bw.write(gridArray[i]); 
     } 
     bw.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.out.println("Error"); 
    } finally { 
     System.out.println("Finished"); 
    } 
} 

我没有和运行,之后该文件gridArrayFile.txt得到了创建并包含字符串Hurray!

+0

解决了例外问题的好习惯。但是,文件中没有任何变化,所以作者一定是错的。你会碰巧有什么想法吗? –

+0

在关闭作家之前,您需要'bw.flush()'内容。否则缓冲的内容将不会写入文件。 – Harmlezz

+0

我试过,但它仍然有相同的奇怪的输出,它会有什么事情与我的数组存储Int? –

0

感谢您帮助下面的每个人都是这个问题的固定解决方案的代码。

public void writeGridToFile() throws IOException { 
    try(BufferedWriter bw = new BufferedWriter(new FileWriter("D:/GridArrayFile.txt"))) { 
     for(int i = 0; i < 100; i++){ 
      bw.write(Integer.toString(GridArray[i])); 
     } 
     bw.flush(); 
    } 
    catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("Error"); 
    } 
    finally { 
      System.out.println("Finished"); 
    } 
}