2016-12-16 99 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