2015-11-18 2 views
2

Я пытаюсь создать и добавить файлы в этот каталог. И ниже мой код, я могу создавать и добавлять к ним файлы, но в конце он бросает мне исключение. Мой код:Файлы, созданные, но все же исключающие исключение

Unzip_Main.java

import java.io.File; 

public class UnZip_Main { 
    public static void main(String[] args) { 

     String zipFilePath = "D:\\News\\Zip\\"; 
     String destDirectory = "D:\\News\\Zip\\Result\\"; 
     new File(destDirectory).mkdir(); 
     UnZip unzipper = new UnZip(); 
     File dir = new File(zipFilePath); 
     File[] files = dir.listFiles(); 
     if (null != files) { 
      for (int fileIntList = 0; fileIntList < files.length; fileIntList++) { 
       String ss = files[fileIntList].toString(); 
       if (null != ss && ss.length() > 0) { 
        System.out.println("unzip path is "); 
        try { 
         System.out.println("dest directry is " + destDirectory); 
         unzipper.unzip(zipFilePath + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()), 
           destDirectory); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 
} 

Unzip.java

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

public class UnZip { 
    private static final int BUFFER_SIZE = 4096; 

    public void unzip(String zipFilePath, String destDirectory) throws IOException { 
     File destDir = new File(destDirectory); 
     if (!destDir.exists()) { 
      destDir.mkdir(); 
     } 
     ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); 
     ZipEntry entry = zipIn.getNextEntry(); 
     while (entry != null) { 
      String filePath = destDirectory + File.separator + entry.getName(); 
      if (!entry.isDirectory()) { 
       // if the entry is a file, extracts it 
       extractFile(zipIn, filePath, zipFilePath); 
      } else { 
       // if the entry is a directory, make the directory 
       File dir = new File(filePath); 
       dir.mkdir(); 
      } 
      zipIn.closeEntry(); 
      entry = zipIn.getNextEntry(); 
     } 
     zipIn.close(); 
    } 

    private void extractFile(ZipInputStream zipIn, String filePath, String zipFilePath) throws IOException { 
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath, true)); 
     byte[] bytesIn = new byte[BUFFER_SIZE]; 
     int read = 0; 
     while ((read = zipIn.read(bytesIn)) != -1) { 
      bos.write(bytesIn, 0, read); 
     } 
     bos.close(); 
     File newName = new File(filePath); 
     String str = zipFilePath.substring(zipFilePath.lastIndexOf("\\") + 1, zipFilePath.lastIndexOf(".")); 
     File zipPath = new File(filePath); 
     zipPath.mkdir(); 
     File oldName = new File(zipPath.getParent() + "\\" + str + ".xml"); 
     if (oldName.exists()) { 
      oldName.delete(); 
     } 
     System.out.println("new name is " + newName + "and old name is " + oldName); 
     if (newName.renameTo(oldName)) { 
      System.out.println("Renamed"); 
     } else { 
      System.out.println("Not Renamed"); 
     } 

    } 

} 

Мой выход:

new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\If16c0c30613111e5850ddea403ecf0ba.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\If83120c05dd311e599a896be76e2f024.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\If8915610629d11e5b64da6abc0693b3d.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\If93445c0661f11e5839c9a236dd16599.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\If9bd10a061f411e5b445d6756f17230b.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\Ife581970612c11e5b64da6abc0693b3d.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\Ifed1c1f05f9a11e5bc448d3219668f6c.xml 
Renamed 
unzip path is 
dest directry is D:\News\Zip\Result\ 
new name is D:\News\Zip\Result\content.xmland old name is D:\News\Zip\Result\Iff5aa9905d4011e5bb1df062954439f5.xml 
Renamed 

Исключение в конце:

java.io.FileNotFoundException: D:\News\Zip\Result (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at UnZip.unzip(UnZip.java:17) 
    at UnZip_Main.main(UnZip_Main.java:19) 

Файлы создаются в правильной папке, все они созданы, но все еще получаю это исключение, не может знать, где я пошло не так и как это исправить ,

Другое дело наблюдается, если я изменить String destDirectory = "D:\\News\\Zip\\Result\\"; к String destDirectory = "D:\\News\\Zip\\";, и если есть какие-либо папки внутри Zip пути, я получаю тот же результат, полученный выше, за исключением, иначе он не бросал каких-либо исключений.

+0

Что такое код в строке 17? –

ответ

2

добавить чек, как это

если (файлы [fileIntList] .isDirectory()) продолжить;

также вы должны изменить код файла переименования должно быть

oldName.renameTo (NEWNAME)

идеале вы должны удалить новый файл (destDirectory) .mkdir();

+0

Можете ли вы объяснить, почему вы должны пропустить первый файл? –

+0

, потому что он создает папку с результатами заранее ... в идеале он должен удалить эту строку новый файл (destDirectory) .mkdir(); – Krishan

+0

Спасибо @ user3857593, это потрясающе и то, что я искал :) – user3872094

1

Эта строка вызывает исключение:

ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); 

, потому что вы даете ему каталог (D: \ Новости \ Zip \ Результат)

пожалуйста, убедитесь, что вы даете ему file путь, а не путь к каталогу.

Попробуйте установить контрольную точку для проверки.

Get FileNotFoundException when initialising FileInputStream with File object

+0

Привет @jmcg, я пытался выталкивать массивные файлы не одним файлом, поэтому я дал путь к каталогу вместо одного файла, можете ли вы предложить, как я могу его исправить? – user3872094

1

Вы не можете открыть каталог в виде файла. Ваш FileInputStream пытается открыть D:\\News\\Zip\\Result\\ который является каталогом.

+0

Привет, Питер, когда я попытался напечатать 'Файл destDir = новый файл (destDirectory); \t \t если (! DestDir.существует()) { \t \t \t destDir.mkdir(); \t \t} \t \t ZipInputStream zipIn = новый ZipInputStream (новый FileInputStream (zipFilePath)); \t \t System.out.println («Новые пути si sa» + zipFilePath); \t \t ZipEntry entry = zipIn.getNextEntry(); 'ouput i got is 'Новые пути si saD: \ News \ Zip \ Iff5aa9905d4011e5bb1df062954439f5.xml', но это путь к файлу, а не путь к каталогу. пожалуйста, исправьте меня, если я ошибаюсь – user3872094

Смежные вопросы