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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> копирование ZIP файла, создаётся "поломанный" файл 
:(
    Опции темы
JavaAnfeanger
Дата 30.4.2013, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!!!

такая проблема... мне нужно создать копию файла (это ZIP). IOUtils это org.apache.commons.io.IOUtils.

Код


         private static final String ZIP_NEWSLETTER_TEMPLATE = "files/export_newsletter.zip";
 . . .
         final InputStream resource =
                getClass().getClassLoader().getResourceAsStream(ZIP_NEWSLETTER_TEMPLATE);
 . . . 
        File tmpFile = File.createTempFile("Newsletter", ".zip");
        IOUtils.copy(resource, new FileOutputStream(tmpFile));
        ZipFile exportZip = new ZipFile(tmpFile, 1);
 . . .


Проблема в том, что ОН "ломает" файл на этапе IOUtils.copy и после этого ZipFile кидает: java.util.zip.ZipException: error in opening zip file. 

В чем может быть причина?

Thanks smile
PM MAIL   Вверх
LSD
Дата 30.4.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(JavaAnfeanger @  30.4.2013,  16:20 Найти цитируемый пост)
Проблема в том, что ОН "ломает" файл на этапе IOUtils.copy

Что значит "ломает"? Ты сравнивал файлы, чем они отличаются?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
JavaAnfeanger
Дата 2.5.2013, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



приложил два ZIPa... один оригинал export_newsletter и NewsletterOwnDevel6365739159989130583, то что получилось в процессе "копирования"... 

Эффект наблюдаестя только на Linux OS!!! Так как программа преднозначенна для сервера который под Linux-ом, то мне очень важно чтобы она именно там и рабртала...

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  export_newsletter.zip 3,43 Kb
PM MAIL   Вверх
JavaAnfeanger
Дата 2.5.2013, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот "поломанный" вариант....

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  NewsletterOwnDevel6365739159989130583.zip 5,16 Kb
PM MAIL   Вверх
LSD
Дата 6.5.2013, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

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



Ошибка у тебя в коде, общее правило таково: кто открывает поток, тот его и закрывает. IOUtils.copy() не открывает поток, и поэтому он его и не закрывает. Ты его открыл, ты должен и закрыть.

И кстати, читать данные из zip можно и прямо из стрима, создавать временный файл совсем не обязательно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Mirkes
Дата 6.5.2013, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не совсем понимаю, зачем для создания просто копии файла вдаваться в детали его устройства. Просто копируем файл любым известным способом. Вот если в него надо что-то дописать или что-то в нем заменить, тогда понятно. Когда я столкнулся с такой задачей я решал ее с помощью следующего класса
Код

package MyFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;


public class MyJar {
    private boolean ready = false;
    private String jarName = "";
    private ArrayList<String> entries = new ArrayList<String>();
    private ZipFile zf = null;
    private FileOutputStream fout = null;
    private ZipOutputStream zout = null;
    private static ZipFile rzf = null;

    /**
     * @param jarName is the name of rewritable jar including path and extension
     * @param newJar is true if new jar file would be created and false otherwise
     */
    public MyJar(String jarName, boolean newJar) {
        super();
        this.jarName = jarName;
        try {
            if (newJar) {
                fout = new FileOutputStream(jarName);
            } else {
                zf = new ZipFile(jarName);
                fout = new FileOutputStream(jarName + "1");
                zout = new ZipOutputStream(fout);
            }
            zout = new ZipOutputStream(fout);
            ready = true;
        } catch (IOException e) {
            e.printStackTrace();
            ready = false;
        }
    }

    /**
     * @param entryName is full name of zip entry. Symbol "/" is used as directory separator
     * @param inp is input stream which contains added entry
     */
    public void addEntry(String entryName, InputStream inp) {
        if (!ready)
            return;
        // If we have such entry - return
        for (String s : entries)
            if (s.equals(entryName))
                return;
        try {
            ZipEntry ze = new ZipEntry(entryName);
            zout.putNextEntry(ze);
            int nLength;
            byte[] buf = new byte[8192];
            while (true) {
                nLength = inp.read(buf);
                if (nLength < 0) {
                    break;
                }
                zout.write(buf, 0, nLength);
            }
            zout.closeEntry();
            entries.add(entryName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void copyOldJar() {
        if (!ready)
            return;
        if (zf == null)
            return;
        InputStream is;
        Enumeration<ZipEntry> en = (Enumeration<ZipEntry>)zf.entries();
        try {
            while (en.hasMoreElements()) {
                ZipEntry ze = en.nextElement();
                is = zf.getInputStream(ze);
                addEntry(ze.getName(), is);
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stop() {
        try {
            zout.close();
            fout.close();
            if (zf != null) {
                zf.close();
                File f1 = new File(jarName + "1");
                File f2 = new File(jarName);
                f2.delete();
                f1.renameTo(f2);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static InputStream getJarFile(String jarName, String entryName) {
        try {
            if (rzf!=null)
                rzf.close();
            rzf = new ZipFile(jarName);
            ZipEntry entry = rzf.getEntry(entryName);
            return  rzf.getInputStream(entry);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static void stopReading(){
        try {
            if (rzf!=null)
                rzf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


вызов выглядел так
Код

        String s = FileMaintain.getFileName("jar", true); //get name of jar file
        if (s.equals(""))
            return;
        MyJar myJar = new MyJar(s, false);
        InputStream is;
        if (bufDB != null) {//memory allocated file to substitute old file in jar
            is = new ByteArrayInputStream(bufDB);
            myJar.addEntry("resource/DataBase.apl", is);
        }
        if (bufMeth != null) {//memory allocated file to substitute old file in jar

            is = new ByteArrayInputStream(bufMeth);
            myJar.addEntry("resource/Methods.meth", is);
        }
        myJar.copyOldJar();//Copy all files which are not substituted
        myJar.stop();//Close new jar file and rename

Правда я работал с jar, а не с zip, но это все равно.


--------------------
Mirkes
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.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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