好吧,Unzip Jar,Zip Jar成功!但再解压缩失败?

时间:2011-01-16 15:44:25

标签: java jar zip unzip

标题说明了所有,虽然在Java解压缩方法中它关闭并给出了这个错误:

java.io.FileNotFoundException: ##File hierarchy here#\armor (Access is denied)

但如果我尝试用7-zip解压缩,我会收到以下错误:

Error: can not delete ouput file: ##File hierarchy here#\armor

对于Jar中的每个文件夹,这意味着它必须是我的压缩方法的问题 - 我希望我有意义!

我采取的步骤: 1.成功拉开罐子 2.成功拉上罐子 3.再次解压缩以找到所有这些错误。

这是我的压缩方法:

package minecraftmodmanager;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Tom
 */
public class jarZip {

    public static void zipAll(File Directory, File jar) {
        try {
            JFrame.debugLn("Opening Jos: " + jar.getName() + "... ");
            JarOutputStream jos = new JarOutputStream(new FileOutputStream(jar));
            zip(Directory, "", jos);
            jos.close();
        } catch (IOException ex) {
            Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void zip(File Directory, String Hierarchy, JarOutputStream jos) {
        try {
            BufferedInputStream in = null;
            File[] directoryFiles = Directory.listFiles();
            JFrame.debug("JOS Opened!");
            System.out.println();

            String FullDirectoryPath = Directory.getAbsolutePath() + File.separator;
            String BasePath = FullDirectoryPath.substring(0, FullDirectoryPath.lastIndexOf(File.separator) + 1);
            JFrame.debug("BasePath: " + BasePath);

            for (int FileNumber = 0; FileNumber < directoryFiles.length; FileNumber++) {

                String name = directoryFiles[FileNumber].getPath();
                String JarFileName = name.replace(BasePath, "");
                String FullFileHierarchy = Hierarchy + JarFileName;

                if (directoryFiles[FileNumber].isDirectory()) {
                    zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
                }

                JFrame.debug("name: " + FullFileHierarchy);
                JarEntry entry = new JarEntry(FullFileHierarchy);
                jos.putNextEntry(entry);
                if(!directoryFiles[FileNumber].isDirectory()) {
                in = new BufferedInputStream(new FileInputStream(directoryFiles[FileNumber]));

                byte[] buffer = new byte[1024];
                while (true) {
                    int count = in.read(buffer);
                    if (count == -1) {
                        break;
                    }
                    jos.write(buffer, 0, count);
                }
                jos.closeEntry();
            } else {
                 jos.closeEntry();
            }

            }

        } catch (Exception ex) {
            Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

赞赏的家伙们!如果我没有遵守和规则,那么有点新来,所以请原谅我

1 个答案:

答案 0 :(得分:0)

我不完全确定,但我认为您的问题可能是您试图将实际文件夹包起来。你不需要 - 当提取文件时,unzipper或unjarrer将根据jar或zip条目的路径创建文件夹。

如果您在子目录上添加一个继续调用zip,例如

    if (directoryFiles[FileNumber].isDirectory()) {
                zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
                continue;
            } 

这应该以递归方式添加您的文件,而不是添加文件夹。

虽然您确实检查过以确保只尝试从文件中读取内容,但您仍尝试将文件夹推入JarOutputStream

            JarEntry entry = new JarEntry(FullFileHierarchy);
            jos.putNextEntry(entry);
            if(!directoryFiles[FileNumber].isDirectory()) {

JarOutputStream认为你创建的文件根本没有任何内容,并且被命名为与你的一个文件夹同名。因此,当需要解压缩时,它会创建一个文件夹和一个具有相同名称的文件。

如果这对您有用,您可以相应地修改其余代码。

希望这会有所帮助: - )