2016-12-16 85 views
0
public static void saveMap(String fileName){ 
    ArrayList<byte[]> mapData = new ArrayList<>(); 
    for(int i = 0; i < DrawPanel.cells.size(); i++){ 
     try { 
      if(DrawPanel.cells.get(i).image != null){ 
       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
       ImageIO.write(DrawPanel.cells.get(i).image,"png",byteArrayOutputStream); 
       byte[] bytes = byteArrayOutputStream.toByteArray(); 
       mapData.add(i,bytes); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    try { 
     FileOutputStream fileOutputStream = new FileOutputStream(new File("res/Saved Maps/"+fileName+".map")); 
     for(int i = 0; i < mapData.size(); i++){ 
      fileOutputStream.write(mapData.get(i)); 
     } 
     fileOutputStream.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

它从每个单元格(一个JPanel)获取图像,将其转换为字节并将其添加到数组列表中。然后它将数组列表写入文件。 我的问题是,我该如何解决这个问题?这样我就可以将每个图像放入相应的单元格中。如何将字节从文件转换为图像 - Java

+1

请注意,从.jar文件运行时,写入应用程序资源将失败,因为资源是.jar归档中的条目,根本不是文件。 – VGR

+0

是我还是这个问题闻起来像[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

回答

0

有在Java中SE1.7序列化对象的概念,它规定:

要序列化一个对象意味着将其状态转换成字节流使字节流可以被还原回副本物体。如果Java对象的类或其任何超类实现java.io.Serializable接口或其子接口java.io.Externalizable,则它是可序列化的。反序列化是将对象的序列化形式转换回对象的一个​​副本的过程。 (摘自here)。

ArrayList实现java.io.SerializableArrayList JavaDoc),因此存储的所有元素被串行化。

在这种情况下,特别是,您可能会改用:

// Serialize the ArrayList mapData 
try (OutputStream file = new FileOutputStream("res/Saved Maps/"+fileName+".map"); 
     OutputStream buffer = new BufferedOutputStream(file); 
     ObjectOutput output = new ObjectOutputStream(buffer);) { 
    output.writeObject(mapData); 
} catch (IOException ex) { 
    System.out.println("Error ocurred: " + ex.getMessage()); 
} 

// Deserialize the 'fileName'.map file 
try (InputStream file = new FileInputStream("'fileName'.map"); 
     InputStream buffer = new BufferedInputStream(file); 
     ObjectInput input = new ObjectInputStream(buffer);) { 
    // Deserialize the ArrayList (serialized on this file) 
    ArrayList<byte[]> recoveredMapData = (ArrayList<byte[]>) input.readObject(); 
    // Display its data 
    for (byte[] cell_byte : recoveredMapData) { 
     System.out.println("=> " + cell_byte); 
    } 
} catch (ClassNotFoundException ex) { 
    System.out.println("Error ocurred: " + ex.getMessage()); 
} catch (IOException ex) { 
    System.out.println("Error ocurred: " + ex.getMessage()); 
} 

对包括Java SE1.6和Java SE1.7实现参见本topic