Проблемы с именами файлов при извлечении JAR в JAVA - PullRequest
0 голосов
/ 17 мая 2018

У меня есть файл jar, сгенерированный gradle (точнее, jar тени) на моем mac.

Когда я перечисляю содержимое банки:

... 
license 
LICENSE/licence.txt 
...

Я использую ZipInputStreamпросмотреть содержимое банки и извлечь его в какую-либо папку (я перебираю записи потока).

Когда я сталкиваюсь с записью LICENSE / licence.txt, я получаю сообщение об ошибкепоскольку Java пытается создать каталог с строчными буквами вместо заглавных букв, и уже существует файл с строчными буквами, поэтому операция не выполняется (так как каталог уже существует).

Я считаю, что это как-тосвязан со спецификациями файловой системы, но я ожидаю правильного поведения, поскольку на компьютере сгенерирован Jar-файл, к которому я также пытаюсь извлечь его.

Это моя функция распаковки -

public void unZipIt(String zipFile, String outputFolder){

 byte[] buffer = new byte[1024];

 try{

    //create output directory is not exists
    File folder = new File(OUTPUT_FOLDER);
    if(!folder.exists()){
        folder.mkdir();
    }

    //get the zip file content
    ZipInputStream zis = 
        new ZipInputStream(new FileInputStream(zipFile));
    //get the zipped file list entry
    ZipEntry ze = zis.getNextEntry();

    while(ze!=null){

       String fileName = ze.getName();
       File newFile = new File(outputFolder + File.separator + fileName);

       System.out.println("file unzip : "+ newFile.getAbsoluteFile());

        //create all non exists folders
        //else you will hit FileNotFoundException for compressed folder
        new File(newFile.getParent()).mkdirs();

        FileOutputStream fos = new FileOutputStream(newFile);             

        int len;
        while ((len = zis.read(buffer)) > 0) {
           fos.write(buffer, 0, len);
        }

        fos.close();   
        ze = zis.getNextEntry();
    }

    zis.closeEntry();
    zis.close();

    System.out.println("Done");

}catch(IOException ex){
   ex.printStackTrace(); 
}}

Я получаю следующее исключение

java.io.FileNotFoundException: /var/folders/4f/9d6qh2cs3rgdmt26ntvs551h006dg0/T/BABU7239734928498030055/META-INF/MANIFEST.MF (Not a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
    at com.waze.bi.emr.jobs.jobcopier.Util.unZipIt(Util.java:170)
    at com.waze.bi.emr.jobs.jobcopier.Util.main(Util.java:196)
...