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)获取图像,将其转换为字节并将其添加到数组列表中。然后它将数组列表写入文件。 我的问题是,我该怎么做才能扭转这种局面?这样我就可以将每个图像放入相应的单元格中。
答案 0 :(得分:0)
Java SE1.7中有Serializable Object的概念,其中指出:
序列化对象意味着将其状态转换为字节流,以便可以将字节流还原为对象的副本。如果Java对象的类或其任何超类实现
java.io.Serializable
接口或其子接口java.io.Externalizable
,则该对象是可序列化的。反序列化是将对象的序列化形式转换回对象副本的过程。 (摘自here)。
ArrayList
实现了java.io.Serializable
(ArrayList 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。