2010-06-30 3 views
2

IMO, je pensais que epub est une sorte de zip. Ainsi, j'ai essayé de décompresser dans a way.Impossible de décompresser EPub fichier

public class Main { 
    public static void main(String argv[ ]) { 
     final int BUFFER = 2048; 

    try { 
     BufferedOutputStream dest = null; 
     FileInputStream fis = new FileInputStream("/Users/yelinaung/Documents/unzip/epub/doyle.epub"); 
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
     ZipEntry entry; 
     while ((entry = zis.getNextEntry()) != null) { 
      System.out.println("Extracting: " + entry); 
      int count; 
      byte data[] = new byte[BUFFER]; 
      // write the files to the disk 
      FileOutputStream fos = new FileOutputStream("/Users/yelinaung/Documents/unzip/xml/"); 
      dest = new BufferedOutputStream(fos, BUFFER); 
      while ((count = zis.read(data, 0, BUFFER)) 
        != -1) { 
       dest.write(data, 0, count); 
      } 
      dest.flush(); 
      dest.close(); 
     } 
     zis.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

j'ai eu cette erreur suivante ..

java.io.FileNotFoundException: /Users/yelinaung/Documents/unzip/xml (No such file or directory) 

que j'ai créé un dossier de cette façon .. et

ma façon de décompressé epub est bonne façon? .. Corriger moi

Répondre

4

J'ai la réponse .. Je n'ai pas vérifié que l'objet qui doit être extrait est un dossier ou pas.

J'ai corrigé de cette façon.

public static void main(String[] args) throws IOException { 
     ZipFile zipFile = new ZipFile("/Users/yelinaung/Desktop/unzip/epub/doyle.epub"); 
     String path = "/Users/yelinaung/Desktop/unzip/xml/"; 

     Enumeration files = zipFile.entries(); 

     while (files.hasMoreElements()) { 
      ZipEntry entry = (ZipEntry) files.nextElement(); 
      if (entry.isDirectory()) { 
       File file = new File(path + entry.getName()); 
       file.mkdir(); 
       System.out.println("Create dir " + entry.getName()); 
      } else { 
       File f = new File(path + entry.getName()); 
       FileOutputStream fos = new FileOutputStream(f); 
       InputStream is = zipFile.getInputStream(entry); 
       byte[] buffer = new byte[1024]; 
       int bytesRead = 0; 
       while ((bytesRead = is.read(buffer)) != -1) { 
        fos.write(buffer, 0, bytesRead); 
       } 
       fos.close(); 
       System.out.println("Create File " + entry.getName()); 
      } 
     } 
    } 

Ensuite, vous l'avez.

+0

Merci pour cette aide. – atrivedi

3

Vous créez un FileOutputStream avec le même nom pour chaque fichier à l'intérieur de votre fichier epub.

Le FileNotFoundException est levé si le fichier existe et qu'il s'agit d'un répertoire. La première fois que vous passez la boucle, le répertoire est créé et la prochaine fois, l'exception est levée.

Si vous souhaitez modifier le répertoire où le epub est extrait, vous devez faire quelque chose comme ceci:

FileOutputStream fos = new FileOutputStream("/Users/yelinaung/Documents/unzip/xml/" + entry.getName()) 

Mise à jour
Création du dossier avant d'extraire chaque fichier que j'ai pu ouvrir le fichier epub

... 
byte data[] = new byte[BUFFER]; 

String path = entry.getName(); 
if (path.lastIndexOf('/') != -1) { 
    File d = new File(path.substring(0, path.lastIndexOf('/'))); 
    d.mkdirs(); 
} 

// write the files to the disk 
FileOutputStream fos = new FileOutputStream(path); 
... 

Et pour changer le dossier dans lequel les fichiers sont extraits, il suffit de changer la ligne où le chemin est défini

String path = "newFolder/" + entry.getName(); 
+0

eahh .. Je l'ai essayé .. et a obtenu la même erreur .. il peut extraire les fichiers .. mais ne peut pas les dossiers .. META -INF est extrait en tant que fichier .. en fait, c'est un sous-dossier du fichier .epub. –

1

Cette méthode a bien fonctionné pour moi,

public void doUnzip(String inputZip, String destinationDirectory) 
     throws IOException { 
    int BUFFER = 2048; 
    List zipFiles = new ArrayList(); 
    File sourceZipFile = new File(inputZip); 
    File unzipDestinationDirectory = new File(destinationDirectory); 
    unzipDestinationDirectory.mkdir(); 

    ZipFile zipFile; 
    // Open Zip file for reading 
    zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ); 

    // Create an enumeration of the entries in the zip file 
    Enumeration zipFileEntries = zipFile.entries(); 

    // Process each entry 
    while (zipFileEntries.hasMoreElements()) { 
     // grab a zip file entry 
     ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); 

     String currentEntry = entry.getName(); 

     File destFile = new File(unzipDestinationDirectory, currentEntry); 

     if (currentEntry.endsWith(".zip")) { 
      zipFiles.add(destFile.getAbsolutePath()); 
     } 

     // grab file's parent directory structure 
     File destinationParent = destFile.getParentFile(); 

     // create the parent directory structure if needed 
     destinationParent.mkdirs(); 

     try { 
      // extract file if not a directory 
      if (!entry.isDirectory()) { 
       BufferedInputStream is = 
         new BufferedInputStream(zipFile.getInputStream(entry)); 
       int currentByte; 
       // establish buffer for writing file 
       byte data[] = new byte[BUFFER]; 

       // write the current file to disk 
       FileOutputStream fos = new FileOutputStream(destFile); 
       BufferedOutputStream dest = 
         new BufferedOutputStream(fos, BUFFER); 

       // read and write until last byte is encountered 
       while ((currentByte = is.read(data, 0, BUFFER)) != -1) { 
        dest.write(data, 0, currentByte); 
       } 
       dest.flush(); 
       dest.close(); 
       is.close(); 
      } 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
    zipFile.close(); 

    for (Iterator iter = zipFiles.iterator(); iter.hasNext();) { 
     String zipName = (String)iter.next(); 
     doUnzip(
      zipName, 
      destinationDirectory + 
       File.separatorChar + 
       zipName.substring(0,zipName.lastIndexOf(".zip")) 
     ); 
    } 

} 
Questions connexes