Java - проблема с Zip to file dir - PullRequest
0 голосов
/ 11 января 2012

Я все еще работаю над тем же приложением из другого вопроса, я работал нормально, пока не начал работать над пустотой ZipExtractToFile, код отлично работает с файлами в корне 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 Ответ

2 голосов
/ 11 января 2012

Прежде всего, вы используете эту строку преждевременно:

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

Это вызовет исключение , поскольку FileOutputStream ожидает файл, а не каталог, и на этом этапевы не уверены, является ли outDir + "\\" + ze.getName() файлом или нет.

Вы должны поставить эту строку после

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

Во-вторых, если вы знаете, что создаете новый каталог, илифайл, и вы знаете его родителя;было бы лучше использовать этот конструктор:

public File(File parent, String child)

См. соответствующий Javadoc .

Использование кода вроде outDir + "\\" + ze.getName() с большей вероятностью приведет к ошибкам, если вы 'не осторожны.

...