Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не получается заархивировать файл (7z) 
:(
    Опции темы
worsvch
Дата 4.5.2014, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Пытаюсь заархивировать файл с помощью 7z, но вылетает исключение  
Exception in thread "main" java.lang.NoClassDefFoundError: org/tukaani/xz/LZMAInputStream
в следующем месте:  
Код

sevenZOutput.write(fileContent);

Весь код:
Код

        SevenZOutputFile sevenZOutput = new SevenZOutputFile(new File("c:\\111\\test.7z"));
        sevenZOutput.setContentCompression(SevenZMethod.LZMA2);
        File f = new File("c:\\111\\test.txt");
        SevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(f,f.getName());
                byte fileContent[] = new byte[(int)f.length()];
        entry.setName("test");
        sevenZOutput.putArchiveEntry(entry);
        sevenZOutput.write(fileContent);
        sevenZOutput.closeArchiveEntry();
        sevenZOutput.finish(); 
        sevenZOutput.close();

Уже и jar файл этот подключил с помощью import (import org.tukaani.xz.LZMA2InputStream;), но исключение как вылетало, так и вылетает.
Подскажите, пожалуйста, что нужно исправить, чтобы исключение перестало вылетать и файл был заархивирован?

Это сообщение отредактировал(а) worsvch - 4.5.2014, 09:14
PM MAIL   Вверх
Mirkes
Дата 4.5.2014, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Я с этим пакетом не работал, но возникает такое впечатление, что на вход write должен подаваться не массив байт а входной поток, из которого write будет читать данные. Проверьте, что нужно подавать в качестве аргумента.


--------------------
Mirkes
PM MAIL   Вверх
Pawl
Дата 4.5.2014, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



подключи к проекту xz-1.4.jar и будет тебе счастье!
Вот как это работает у меня (с использованием библиотек commons-compress-1.8.jar и xz-1.4.jar):
Код

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZMethod;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    public static void main(String ...args) {
        try {
            SevenZOutputFile sevenZOutput = new SevenZOutputFile(new File("D://tmp//WTFcode.7z"));
            sevenZOutput.setContentCompression(SevenZMethod.LZMA2);
            SevenZArchiveEntry entry = new SevenZArchiveEntry();
            entry.setName("WTFcode.txt");
            sevenZOutput.putArchiveEntry(entry);
            Path path = Paths.get("D://tmp//WTFcode.txt");
            byte[] data = Files.readAllBytes(path);
            sevenZOutput.write(data);
            sevenZOutput.closeArchiveEntry();
            sevenZOutput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Это сообщение отредактировал(а) Pawl - 4.5.2014, 21:27


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
worsvch
Дата 5.5.2014, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(Pawl @ 4.5.2014,  21:25)
подключи к проекту xz-1.4.jar и будет тебе счастье!

Действительно ошибка пропала, но файл который внутри архива не читается, говорит "Ошибка диска", хотя вне архива он нормально открывается, сохранял в другие места, на другие диски, не помогло.
PM MAIL   Вверх
Pawl
Дата 5.5.2014, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(worsvch @  5.5.2014,  17:18 Найти цитируемый пост)
Действительно ошибка пропала, но файл который внутри архива не читается, говорит "Ошибка диска", хотя вне архива он нормально открывается, сохранял в другие места, на другие диски, не помогло.

1) вместо 
Цитата(worsvch @  4.5.2014,  08:05 Найти цитируемый пост)
entry.setName("test");

надо 
Код

entry.setName("test.txt");

и вообще эта строчка тут не нужна, т. к. ты уже создал entry с именем файла:
Код

SevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(f, f.getName());

2) Вот так
Код

byte fileContent[] = new byte[(int)f.length()];

ты просто создаешь массив байт определенной длины, но не инициализируешь его данными из файла. Надо делать, как в моем примере. Применительно к твоему файлу, рабочий код будет выглядеть так:
Код

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZMethod;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    public static void main(String ...args) {
        try (SevenZOutputFile sevenZOutput = new SevenZOutputFile(new File("c:\\111\\test.7z"))) {
            sevenZOutput.setContentCompression(SevenZMethod.LZMA2);
            File f = new File("c:\\111\\test.txt");
            SevenZArchiveEntry entry = sevenZOutput.createArchiveEntry(f, f.getName());
            Path path = Paths.get(f.getAbsolutePath());
            byte fileContent[] = Files.readAllBytes(path);
            sevenZOutput.putArchiveEntry(entry);
            sevenZOutput.write(fileContent);
            sevenZOutput.closeArchiveEntry();
            sevenZOutput.finish();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
worsvch
Дата 5.5.2014, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Сделал как вы написали, та же ошибка
PM MAIL   Вверх
Pawl
Дата 5.5.2014, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(worsvch @  5.5.2014,  18:00 Найти цитируемый пост)
Сделал как вы написали, та же ошибка

та блин, не может быть! Ты код просто скопипастил или что-то менял? Если нет, то какие библиотеки используешь? Для чистоты эксперимента Создай новый проект, подключи к нему только commons-compress-1.8.jar и xz-1.4.jar и скопируй туда мой код. У меня в такой конфигурации все работает.
Да, и чисто на всякий случай: файл c:\\111\\test.txt должен существовать, открыт для чтения, копирования и пр., и в нем должен быть какой-то текст.

Это сообщение отредактировал(а) Pawl - 5.5.2014, 20:30


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
worsvch
Дата 5.5.2014, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(Pawl @ 5.5.2014,  18:10)
Цитата(worsvch @  5.5.2014,  18:00 Найти цитируемый пост)
Сделал как вы написали, та же ошибка

та блин, не может быть! Ты код просто скопипастил или что-то менял? Если нет, то какие библиотеки используешь? Для чистоты эксперимента Создай новый проект, подключи к нему только commons-compress-1.8.jar и xz-1.4.jar и скопируй туда мой код. У меня в такой конфигурации все работает.
Да, и чисто на всякий случай: файл c:\\111\\test.txt должен существовать, открыт для чтения, копирования и пр., и в нем должен быть какой-то текст.

1. Делаю в Eclipse for java
2. commons-compress-1.8.jar и xz-1.4.jar - именно их и подключил, притом создавал zip-архив, с ним проблем не было, проблема именно с 7z
3. Копировал именно ваш код, тот же результат.
4. Файл существует, открыт для чтения, текст есть. Ради эксперимента пробовал создать архив программой 7-zip: в этом случае архив  создается корректный, но используется метод LZMA, LZMA2 я в этой программе не нашел
Протестировал созданный java-программой 7-zip архив, думаю проблема в использовании LZMA2. Была следующая ошибка: "Неподдерживаемый метод сжатия"

Добавлено через 10 минут и 26 секунд
С этой проблемой разобрался: архив нормально открывается через другие архиваторы.
Обнаружилась еще одна проблема, если архивировать к примеру бинарный файл размером примерно несколько десятков мегабайт, то вылетает исключение java.lang.OutOfMemoryError: JavaHeapSpace.

Это сообщение отредактировал(а) worsvch - 5.5.2014, 21:08
PM MAIL   Вверх
Pawl
Дата 5.5.2014, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(worsvch @  5.5.2014,  21:07 Найти цитируемый пост)
С этой проблемой разобрался:

Ну слава Богу! smile  Надеюсь, моя помощь в этом сыграла свою роль? smile 
Цитата(worsvch @  5.5.2014,  21:07 Найти цитируемый пост)
архив нормально открывается через другие архиваторы.

А каким вы изначально пользовались? У меня есть и winzip  и winrar и встроенные в total commander архиваторы - все с архивом работали прекрасно...
Цитата(worsvch @  5.5.2014,  21:07 Найти цитируемый пост)
если архивировать к примеру бинарный файл размером примерно несколько десятков мегабайт, то вылетает исключение java.lang.OutOfMemoryError: JavaHeapSpace.

"несколько десятков мегабайт" - это сколько именно? Я архивировал файл в 70 МБ - все сработало, правда, секунд за 20, и оперативки было задействовано 68% (у меня ее 4 ГБ). Что до JavaHeapSpace, отвечу цитатой из хабра:
Цитата

1. java.lang.OutOfMemoryError: Java heap space

 Не хватает место в куче, а именно, в области памяти в которую помещаются объекты, создаваемые программно в вашем приложении. Размер задается параметрами -Xms и -Xmx. Если вы пытаетесь создать объект, а места в куче не осталось, то получаете эту ошибку.

Трудно в данном случае регулировать количество создаваемых объектов, т. к. не известно, как именно работают библиотеки commons-compress-1.8.jar и xz-1.4.jar. Тут может помочь комп помощнее...


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
worsvch
Дата 5.5.2014, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



1. Pawl вы действительно мне очень помогли. Спасибо вам за это.
2. Изначально пользовался 7-zip
3. Я архивировал файл размером 65мб. Но нужно будет архивировать и файлы размером больше гигабайта, 
поэтому и был выбран 7z, так как прилично сжимает



Это сообщение отредактировал(а) worsvch - 5.5.2014, 23:17
PM MAIL   Вверх
Pawl
Дата 6.5.2014, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(worsvch @  5.5.2014,  23:15 Найти цитируемый пост)
1. Pawl вы действительно мне очень помогли. Спасибо вам за это.

Чёт благодарности в репе не заметил smile 
Цитата(worsvch @  5.5.2014,  23:15 Найти цитируемый пост)
Изначально пользовался 7-zip

Понятно. Как раз этого архиватора у меня нет...
Цитата(worsvch @  5.5.2014,  23:15 Найти цитируемый пост)
Но нужно будет архивировать и файлы размером больше гигабайта, поэтому и был выбран 7z, так как прилично сжимает

7z может и прилично сжимает, но те 7z- архивы, которые делаются при помощи commons-compress, сжаты так себе. Не знаю, как у вас, а у меня "сжатые" бинарные файлы получались сопоставимого размера, а архивы с текстовыми файлами вообще имели размер, больший, чем не сжатые файлы! smile


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.