Есть следующий код (упрощенно):
private byte[] getData ()
{
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(dataStream);
try
{
for ()
{
// здесь формируется КУЧА текстовых данных
}
}
finally
{
writer.close();
}
return dataStream.toByteArray();
}
private static byte[] zipData ( String name, byte[] data ) throws UploaderException
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try
{
ZipOutputStream zipStream = new ZipOutputStream(stream);
//noinspection NestedTryStatement
try
{
zipStream.putNextEntry(new ZipEntry(name));
zipStream.write(data);
zipStream.closeEntry();
}
finally
{
zipStream.close();
}
}
catch (IOException e)
{
throw new UploaderException(MessageFormat.format("Error packing {0}.", name), e);
}
return stream.toByteArray();
}
И примерно так он используется (отправка по почте):
Multipart multipart = new MimeMultipart();
BodyPart part = new MimeBodyPart();
part.setFileName(zipfileName);
byte[] bytes = zipData(repFileName, getData());
DataSource dataSource = new ByteArrayDataSource(bytes, "application/zip");
part.setDataHandler(new DataHandler(dataSource));
multipart.addBodyPart(part);
message.setContent(multipart);
message.saveChanges();
Transport.send(message);
Код в запарке был взят с каких-то самплов и на скорую руку доведен под свои нужды.
Теперь хочется как-то оптимизировать, в первую очередь экономить память, т.к. массивы данных м.б. очень большими. И что-то не вижу как?
ZipOutputStream пакует только байтовые массивы. Посоветуйте куда копнуть!
Здравствуйте, dimok@, Вы писали:
D>Есть следующий код (упрощенно):
D>И примерно так он используется (отправка по почте):
D>D> Multipart multipart = new MimeMultipart();
D> BodyPart part = new MimeBodyPart();
D> part.setFileName(zipfileName);
D> byte[] bytes = zipData(repFileName, getData());
D> DataSource dataSource = new ByteArrayDataSource(bytes, "application/zip");
D> part.setDataHandler(new DataHandler(dataSource));
D> multipart.addBodyPart(part);
D> message.setContent(multipart);
D> message.saveChanges();
D> Transport.send(message);
D>
D>Код в запарке был взят с каких-то самплов и на скорую руку доведен под свои нужды.
D>Теперь хочется как-то оптимизировать, в первую очередь экономить память, т.к. массивы данных м.б. очень большими. И что-то не вижу как?
D>ZipOutputStream пакует только байтовые массивы. Посоветуйте куда копнуть!
Чт то я не понял про выделенное?
http://blogs.sun.com/CoreJavaTechTips/entry/creating_zip_and_jar_files
Я так понял это связано с твоим предыдущим вопросом?
выбираем кусками данные и сразу пишем в OutputStream, который = new ZipOutputStream (new FileOutputStream(временый файл));
в письмо соответственно вставляем без ByteArrayDataSource а напрямую из того временного файла.