Java распаковать из URL пропускает 2 КБ на файл - PullRequest
1 голос
/ 15 августа 2011

Я пытаюсь разархивировать файл из Интернета, используя следующий код.В одном из файлов ("uq.class") после того, как он был распакован из онлайн-источника, отсутствует около 2 КБ размера файла (исходный файл - 10 084, распакованный - 8 261).Все остальные файлы выглядят вполне нормально, и когда я копирую файл uq.class из zip-файла и помещаю его вручную, он прекрасно работает.Может кто-нибудь объяснить, что происходит и предоставить исправление?Ниже приведены части кода для распаковки.

public static File unpackArchive(URL url, File targetDir) throws IOException {
    if (!targetDir.exists()) {
        targetDir.mkdirs();
    }
    InputStream in = new BufferedInputStream(url.openStream(), 2048);
    // make sure we get the actual file
    File zip = File.createTempFile("arc", ".zip", targetDir);
    OutputStream out = new BufferedOutputStream(new FileOutputStream(zip),2048);
    copyInputStream(in, out);
    out.close();
    return unpackArchive(zip, targetDir);
}
public static File unpackArchive(File theFile, File targetDir) throws IOException {
    if (!theFile.exists()) {
        throw new IOException(theFile.getAbsolutePath() + " does not exist");
    }
    if (!buildDirectory(targetDir)) {
        throw new IOException("Could not create directory: " + targetDir);
    }
    ZipFile zipFile = new ZipFile(theFile);
    for (Enumeration entries = zipFile.entries(); entries.hasMoreElements();) {
        ZipEntry entry = (ZipEntry) entries.nextElement();
        File file = new File(targetDir, File.separator + entry.getName());
        if (!buildDirectory(file.getParentFile())) {
            throw new IOException("Could not create directory: " + file.getParentFile());
        }
        if (!entry.isDirectory()) {
            copyInputStream(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(file),2048));
        } else {
            if (!buildDirectory(file)) {
                throw new IOException("Could not create directory: " + file);
            }
        }
    }
    zipFile.close();
    theFile.delete();
    return theFile;
}

public static void copyInputStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    while (len >= 0) {
        out.write(buffer, 0, len);
        len = in.read(buffer);
    }
    in.close();
    out.close();
}
public static boolean buildDirectory(File file) {
    return file.exists() || file.mkdirs();
}

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

С первого взгляда не вижу ничего плохого в коде. Однако я бы порекомендовал вам сделать это более безопасно закрывать ваши потоки. В вашей текущей реализации вы одновременно закрываете входящие и исходящие потоки, операторы close могут вызывать исключения, как и операторы read и write! В случае сбоя любого из этих файлов ваши файлы останутся открытыми, и со временем в вашем приложении закончатся файловые дескрипторы. Вам лучше делать закрытие в операторе finally, так что вы уверены, что они закрываются.

0 голосов
/ 16 августа 2011

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

...