1

次のコードを使用して、インターネットからファイルを解凍しようとしています。ファイルの 1 つ (「uq.class」) で、オンライン ソースから解凍した後、約 2kb のファイル サイズがありません (元のファイルは 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();
}
4

2 に答える 2

2

一見しただけでは、コードに問題があることを直接確認することはできません。ただし、ストリームをより安全に閉じることをお勧めします。現在の実装では、in ストリームと out ストリームを同時に閉じます。close ステートメントは、ステートメントの読み取りと書き込みと同様に例外を引き起こす可能性があります。これらのいずれかが失敗した場合、ファイルは開いたままになり、やがてアプリケーションはファイル記述子を使い果たします。最終ステートメントでクロージングを行う方が良いでしょう。そうすれば、それらが確実にクローズされます。

于 2011-08-15T10:13:29.340 に答える
0

サインインできない理由はわかりませんが、問題は解決しました。馬の前にカート全体をやりました。適切なファイルを抽出し、その上に古いファイルを抽出したので、古いファイルを再統合し続けました。窓の外で5時間のプログラミング。覚えておいてください、適切なプログラミング アーキテクチャを使用すると、頭の痛い問題が大幅に軽減されます。

于 2011-08-16T01:35:08.247 に答える