Java - 压缩文件目录问题

时间:2012-01-11 06:15:29

标签: java file io zip

我还在从另一个问题开始处理相同的应用程序,我一直很好,直到我开始处理ZipExtractToFile void,代码与zip根目录中的文件工作正常但是dir失败,这是控制台的输出:

Exception in thread "main" java.io.FileNotFoundException: minecraft\achievement\bg.png (The system cannot find the path specified)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at com.hachisoftware.mmi.system.Util.ZipExtractToFile(Util.java:56)
at com.hachisoftware.mmi.MinecraftModInstaller.startSystem(MinecraftModInstaller.java:51)
at com.hachisoftware.mmi.MinecraftModInstaller.main(MinecraftModInstaller.java:27)

这是代码:

public static void ZipExtractToFile(File inZip, File outDir) throws IOException
{
    ZipInputStream zis = new ZipInputStream(new FileInputStream(inZip));
    if(!outDir.exists())
    {
        outDir.mkdir();
    }
    byte[] buffer = new byte[1024];

    for (ZipEntry ze = zis.getNextEntry(); ze != null; ze = zis.getNextEntry()) 
    {
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(outDir + "\\" + ze.getName())));

        if(ze.isDirectory())
        {
            File dir = new File(ze.getName());
            dir.mkdir();
            continue;
        }

        for (int read = zis.read(buffer); read != -1; read = zis.read(buffer)) {
            out.write(buffer, 0, read);
        }
        out.flush();
        out.close();
    }

    zis.close();
}

错误发生在:

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(outDir + "\\" + ze.getName())));

1 个答案:

答案 0 :(得分:2)

首先,你过早地使用这条线:

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(outDir + "\\" + ze.getName())));

这将是throw an exception,因为FileOutputStream需要一个文件,而不是一个目录,而且在这个阶段你不确定outDir + "\\" + ze.getName()是否是一个文件。

你应该把这一行放在

之后
if(ze.isDirectory()) {...}

其次,如果你知道你正在创建一个新目录或一个文件,并且你知道它的父目录;最好使用这个构造函数:

public File(File parent, String child)

请参阅relevant Javadoc

如果您不小心,使用outDir + "\\" + ze.getName()之类的代码更有可能导致错误。