从URL解压缩的URL错过了2kb的文件

时间:2011-08-15 09:59:05

标签: java unzip data-loss

我正在尝试使用以下代码从Internet解压缩文件。在其中一个文件(“uq.class”)上,从联机源解压缩后,缺少大约2kb的文件大小(原始文件是10,084,解压缩后得到8,261)。所有其他文件似乎都完全正常,当我从zip中复制uq.class文件并手动放置它时,它完全正常运行。任何人都可以解释发生了什么并提供修复?下面是代码的解压缩部分。

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 个答案:

答案 0 :(得分:2)

第一眼看不到代码有什么问题。我建议你做的是更安全地关闭你的流。在当前的实现中,您同时关闭输入和输出流,关闭语句可能会导致异常,因为可以读取和写入语句!如果其中任何一个失败,您的文件将保持打开状态,并且您的应用程序将耗尽文件描述符。你最好在finally语句中结束,这样你肯定会关闭它。

答案 1 :(得分:0)

我不知道为什么我不能登录,但我想出了这个问题。我在马之前做过整车。我解压缩了正确的文件,然后将旧文件解压缩,因此我不断重新整合旧文件。窗外编程5个小时。请记住,小孩,正确的编程架构可以为您节省大量的麻烦。