我有一个方法,我有一个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"));
任何人都知道更好的方法,或者看看我做错了什么?
IDEA
我可以针对这个问题设置一个try catch语句吗?当它发生时调用byteOut.flush()
?
提前致谢
答案 0 :(得分:3)
你正在制作许多数据副本,这导致你的内存不足。
您应该在第一个循环中直接写入ZipOutputStream
。
ZipEntry entry = new ZipEntry(fileName);
zos.putNextEntry(entry);
for (String s : nodeStringArray) {
zos.write(s.getBytes("UTF-8"));
}
zos.closeEntry();