Оптимизация zip-сжатия
От: dimok@  
Дата: 09.06.07 07:45
Оценка:
Есть следующий код (упрощенно):
    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 пакует только байтовые массивы. Посоветуйте куда копнуть!
Re: Оптимизация zip-сжатия
От: GarryIV  
Дата: 09.06.07 14:45
Оценка:
Здравствуйте, 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 а напрямую из того временного файла.
WBR, Igor Evgrafov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.