2010-05-06 34 views
3

J'ai un inputStream d'un fichier docx et je dois me procurer le document.xml qui se trouve dans le docx.Obtention de document.xml à partir d'un fichier docx à l'aide de ZipInputStream

J'utilise ZipInputStream lire mon flux et mon code est quelque chose comme

ZipInputStream docXFile = new ZipInputStream(fileName); 
    ZipEntry zipEntry; 
    while ((zipEntry = docXFile.getNextEntry()) != null) { 
     if(zipEntry.getName().equals("word/document.xml")) 
     { 
      System.out.println(" --> zip Entry is "+zipEntry.getName()); 
     } 
    } 

Comme vous pouvez voir la sortie pour zipEntry.getName se présente comme « mot/document.xml » à un moment donné. J'ai besoin de passer ce document.xml comme un flux et contrairement à la méthode ZipFile où vous pouvez facilement passer cela en appelant .getInputStream, je me demande comment puis-je faire ce docXFile?

Merci à l'avance, Meenakshi

@Update: J'ai trouvé la sortie pour cette solution:

 ZipInputStream docXFile = new ZipInputStream(fileName); 
    ZipEntry zipEntry; 
    OutputStream out; 

    while ((zipEntry = docXFile.getNextEntry()) != null) { 
     if(zipEntry.toString().equals("word/document.xml")) 
     { 
      System.out.println(" --> zip Entry is "+zipEntry.getName()); 
      byte[] buffer = new byte[1024 * 4]; 
      long count = 0; 
      int n = 0; 
      long size = zipEntry.getSize(); 
      out = System.out; 

      while (-1 != (n = docXFile.read(buffer)) && count < size) { 
       out.write(buffer, 0, n); 
       count += n; 
      } 
     } 
    } 

Je me demande s'il y a une API de base pour convertir ce flux de sortie flux d'entrée ?

Répondre

2

Quelque chose comme cela devrait fonctionner (non testé):

ZipFile zip = new ZipFile(filename) 
Enumeration entries = zip.entries(); 
while (entries.hasMoreElements()) { 
    ZipEntry entry = (ZipEntry)entries.nextElement(); 

    if (!entry.getName().equals("word/document.xml")) continue; 

    InputStream in = zip.getInputStream(entry); 
    handleWordDocument(in); 
} 

En outre, vous pouvez jeter un oeil à une autre bibliothèque zip outre le construit en un. AFAIK le built-in ne supporte pas tous les niveaux de compression/cryptage modernes et d'autres choses.