OutOfMemoryError при записи строки в ByteArrayOutputStream

У меня есть метод, в котором у меня есть массив объектов String, которые мне нужно записать в ByteArrayOutputStream, который позже я запишу в ZipOutputStream.

Вот мой код.

// SAVE THE STRING AS A BYTE ARRAY IN MEMORY INSTEAD OF CREATING AND SAVING TO A NEW FILE
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream byteOut = new DataOutputStream(baos);
            byte[] data;
            if (i == 1) {
                if (nodeStringArray != null) {
                    for (String s : nodeStringArray) {
                        byteOut.write(s.getBytes("UTF-8"));
                    }
                }
            } else {
                data = stringArray.get(i).getBytes("UTF-8");
                byteOut.write(data);
            }


            byteOut.close();
            byte[] input = baos.toByteArray();

            ZipEntry entry = new ZipEntry(fileName);
            entry.setSize(input.length);
            zos.putNextEntry(entry);
            zos.write(input);
            zos.closeEntry();

Проблема в том, что я получил только отчет о сбое, я получаю OutOfMemoryError в строке, которая читает byteOut.write(s.getBytes("UTF-8"));

Кто-нибудь знает лучший способ сделать это или может увидеть, делаю ли я что-то не так?

ИДЕЯ

Могу ли я поставить оператор try catch вокруг проблемы и, когда это произойдет, вызвать byteOut.flush()?

Заранее спасибо


person StuStirling    schedule 22.02.2013    source источник


Ответы (1)


Вы делаете много копий данных, и это приводит к нехватке памяти.

Вы должны напрямую писать в свой ZipOutputStream в своем первом цикле.

ZipEntry entry = new ZipEntry(fileName);
zos.putNextEntry(entry);
for (String s : nodeStringArray) {
    zos.write(s.getBytes("UTF-8"));
}
zos.closeEntry();
person Tom Cammann    schedule 22.02.2013