2016-12-16 6 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.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()); 
} 

Смотрите эту topic для реализации на Java как SE1.6 и Java SE1.7.