如何将文件中的字节转换为图像 - Java

时间:2016-12-16 16:36:32

标签: java image swing arraylist byte

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)获取图像,将其转换为字节并将其添加到数组列表中。然后它将数组列表写入文件。 我的问题是,我该怎么做才能扭转这种局面?这样我就可以将每个图像放入相应的单元格中。

1 个答案:

答案 0 :(得分:0)

Java SE1.7中有Seri​​alizable Object的概念,其中指出:

  

序列化对象意味着将其状态转换为字节流,以便可以将字节流还原为对象的副本。如果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