Write zip entry at end of existing zip file

I need to open an existing zip file and write a new entry into the zip file. My code appears to overwrite the first entry wiping out the existing entries. I may need to provide an offset when I use the write method on the ZipOutputStream, but I am not sure how to calculate the offset based on the existing entries in the zip. Any ideas?
// Currently I open a ZipOutputStream based on an existing file name
FileOutputStream fos = new FileOutputStream("C:/temp/test.zip", true); // append to file
ZipOutputStream zos = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry("foo.txt");
zos.putNextEntry(ze); // this doesn't seem to position the next write statement at the correct spot
zos.write(ba); // where ba is byte array being generated with a FileInputStream from foo.txt

You could try, but I'm not 100% it'll work...
ZipFile zf = new ZipFile ("MyZip.zip");
ZipOutputStream zout = new ZipOutputStream (new FileOutputStream ("MyZip2.zip");
Enumeration enum = zf.entries ();
while (enum.hasMoreElements ())
    // Not sure what's by nextElement...probably ZipEntry...
    ZipEntry zen = (ZipEntry) enum.nextElement ();
    zout.putNextEntry (zen);
    // Get the InputStream for the entry and then write out to the ZipOutputStream...
// Now we are at the end of our new Zip...add our Entry...
ZipEntry myen = new ZipEntry ("MyEntry.txt");
// Again write out the content of the entry (MyEntry.txt file) to the ZipOutputStream...
// Close the ZipOutputStream.
// Get a file object to the MyZip2.zip and rename to MyZip.zip.This is messy and horrible but it seems to be the only way...I'm pretty sure that if you write directly to MyZip.zip then it would cause an IOException because you would be reading and writing at the same time...dodgy...
At the moment all you are doing is creating a completely new Zip file, any existing file is just getting overwritten...

Similar Messages

  • ByteArrayInputStream as source for zip file entry corrupts the ByteArray

    Hi All,
    I have managed to create and add a (in-memory) zip file as an email attachment. I add a file to the zip file , then push data to this file via a ByteArrayInputStream.
    Adding the file (created via ByteArrayInputStream) to an email works perfectly. If i then add another step and zip this file it corrupts the output.
    It looks like it is turning the carriage return into a [] . Its 'almost right' as when I cut & paste the contents of the txt file i created (from the zip file) into Word it displays correctly, with the carriage returns. Is it some kind of encoding problem, or mime type issue?
    My ByteArrayInputStream uses buf.append("\n"); for carriage returns. I think the problem is with
    ByteArrayInputStream baIn = new  ByteArrayInputStream( getAttachementNoFormat(eq_rt.getStoredProc()) );where I think i need to encode this somehow. Here is the complete code to create and add the zip file to an email. Any isuggestions will be appreciated.
    //START of new ZIP code    
                                                                                             /* Specify files to be zipped */
                                                                                            // Create temp file.
                                                                                            //File temp = File.createTempFile(fileName, ".txt");                           
                                                                                            //temp.deleteOnExit();                                                           
                                                                                            //BufferedWriter bOut = new BufferedWriter(new FileWriter(temp));                                                          
                                                                                            //ByteArrayInputStream baInTemp = new ByteArrayInputStream( getAttachementNoFormat(eq_rt.getStoredProc() ) );
                                                                                            //bOut.write( baInTemp.toString() );
                                                                                            //bOut.close();
                                                                                             String[] filesToZip = new String[3];
                                                                                             filesToZip[0] = "C:\\Program Files\\NetBeans3.6\\firstfile.txt";
                                                                                             filesToZip[1] = "C:\\Program Files\\NetBeans3.6\\secondfile.txt";
                                                                                             filesToZip[2] = "C:\\Program Files\\NetBeans3.6\\thirdfile.txt";
                                                                                             final String fileToZip = fileName;
                                                                                             /*  Create a memory buffer to store the ByteArray, fixed size */                                                         
                                                                                             byte[] buffer = new byte[18024];
                                                                                             /* Specify zip file name */
                                                                                             String zipFileName= eq_rt.getReportName() + ".zip";
                                                                                             try {
                                                                                                 /* Create ZipOutputStream to store the FileOutputStream */
                                                                                                 // ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
                                                                                                 ByteArrayOutputStream byteArray = new ByteArrayOutputStream();                                                             
                                                                                                 ZipOutputStream out = new ZipOutputStream(byteArray);                                                              
                                                                                                 /* Set the compression ratio */
                                                                                                 out.setLevel(Deflater.DEFAULT_COMPRESSION);
                                                                                                 /* iterate through the array of files, adding each to the zip file */
                                                                                                 for (int a = 0; a < filesToZip.length; a++) {
                                                                                                    /* Print the filenumber being added to the zip */
                                                                                                    System.out.println(a);
                                                                                                    /* Associate a file input stream for the current file */
                                                                                                   // FileInputStream in = new FileInputStream(filesToZip[a]);
                                                                                                       This ROCKS as it is passing a array into the text file .getBytes() seems
                                                                                                       to be the KEY in getting ByteArrayInputStream to WORK
                                                                                                    //String strSocketInput = "TAIWAN";
                                                                                                    //ByteArrayInputStream baIn = new ByteArrayInputStream(strSocketInput.getBytes());
                                                                                                    //String strSocketInput = new String (getAttachementNoFormat(eq_rt.getStoredProc()).toString() );                                                                                           
                                                                                                    //ByteArrayInputStream baIn = new ByteArrayInputStream( getAttachementNoFormat(eq_rt.getStoredProc()) );
                                                                                                     ByteArrayInputStream baIn = new  ByteArrayInputStream( getAttachementNoFormat(eq_rt.getStoredProc()) );
                                                                                                    //String strSocketInput = "TAIWAN";
                                                                                                    //ByteArrayInputStream baIn = new ByteArrayInputStream(strSocketInput.getBytes());
                                                                                                    /* Add ZIP entry to output stream. */                                                   
                                                                                                    out.putNextEntry(new ZipEntry(filesToZip[a]));                                                  
                                                                                                    /* Transfer bytes from the current file to the ZIP file */
                                                                                                    int len;
                                                                                                    while ((len = baIn.read(buffer)) > 0)
                                                                                                    out.write(buffer, 0, len);
                                                                                                    /* Close the current entry */
                                                                                                    out.closeEntry();
                                                                                                    /* Close the current file input stream */
                                                                                                    baIn.close();                                                   
                                                                                                /* Close the ZipOutPutStream (very important to close the zip before you attach it to the email) Thanks DrClap */
                                                                                                out.close();                                                    
                                                                                                /* Create a datasource for email attachment */
                                                                                                // DataSource sourcezip = new FileDataSource(zipFileName);
                                                                                                DataSource sourcezip = new ByteArrayDataSource(byteArray.toByteArray(), zipFileName, "application/gzip" );
                                                                                                /* Create a new MIME bodypart */
                                                                                                BodyPart attachment = new MimeBodyPart();
                                                                                                attachment.setDataHandler(new DataHandler(sourcezip));
                                                                                                attachment.setFileName(zipFileName);                       
                                                                                                /* attach the attachemnts to the mail */
                                                                                                multipart.addBodyPart(attachment);                                                       
                                                                                             catch (IllegalArgumentException iae) {
                                                                                               iae.printStackTrace();
                                                                                             catch (FileNotFoundException fnfe) {
                                                                                               fnfe.printStackTrace();
                                                                                             catch (IOException ioe)
                                                                                             ioe.printStackTrace();
                                                                                           // End Of New ZIP code    

    I came up with 'a' solution (not sure if its the best way but appears to work)
    \n = corrupt
    \r\n = ok in zip

  • ZipException: ZIP file must have at least one entry

    When I place a security constraint on jar files in a Tomcat server to prevent unauthenticated access to the jar files
    <security-constraint>
    <display-name>Security Constraint</display-name>
    <web-resource-collection>
    <web-resource-name>ee</web-resource-name>
    <url-pattern>*.jnlp</url-pattern>
    <url-pattern>*.jar</url-pattern>
    </web-resource-collection>
    our jnlp applications can no longer download the needed jar resources and I get the following exception. ( It works fine when I take jar files out of the security-constraint list.) Any suggestions on why this is happening and how to get this to work?
    Thanks.
    java.util.zip.ZipException: ZIP file must have at least one entry
         at java.util.zip.ZipOutputStream.finish(Unknown Source)
         at java.util.zip.DeflaterOutputStream.close(Unknown Source)
         at java.util.zip.ZipOutputStream.close(Unknown Source)
         at com.sun.deploy.net.HttpDownloadHelper.download(Unknown Source)
         at com.sun.deploy.cache.Cache.downloadResourceToTempFile(Unknown Source)
         at com.sun.deploy.cache.Cache.downloadResourceToCache(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
         at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
         at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
         at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
         at java.util.concurrent.FutureTask.run(Unknown Source)
         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
         at java.lang.Thread.run(Unknown Source)

    What am i missing here???
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("out.zip"));
    void goDir(String dirName) {
    File dirObj = new File(dirName);
    if (dirObj.exists() == true) {
    if (dirObj.isDirectory() == true) {
    // create an array of File objects
    File[] fileList = dirObj.listFiles();
    for (int i = 0; i < fileList.length; i++) {
    if (fileList.isDirectory()) {
    goDir(fileList[i].getPath());
    else if (fileList[i].isFile()) {
    goZip(fileList[i].getPath());
    } // loop
    else {
    else {
    void goZip(String filePath) {
    try {
    FileInputStream fis = new FileInputStream(filePath);
    BufferedInputStream bis = new BufferedInputStream(fis);
    ZipEntry fileEntry = new ZipEntry(filePath);
    zos.putNextEntry(fileEntry);
    byte[] buff = new byte[1024];
    int len;
    while ( (len = bis.read(buff)) > 0) {
    zos.write(buff, 0, len);
    zos.closeEntry();
    bis.close();
    catch (java.io.IOException ioe) {
    ioe.printStackTrace()

  • Adding a file into existing zip file

    I need a add a file into existing zip file. and write into printwriter.
    How to do it?
    Waiting for the reply.
    Thanks and Regards,
    Narayanan. G

    Narayanan.G wrote:
    I need a add a file into existing zip file.API: [ZipOutputStream#putNextEntry()|http://java.sun.com/javase/6/docs/api/java/util/zip/ZipOutputStream.html#putNextEntry%28java.util.zip.ZipEntry%29]
    Tutorial: [http://java.sun.com/developer/technicalArticles/Programming/compression/].
    and write into printwriter.Writing a zip file into printwriter? Huh? Please elaborate.

  • Bursting Error : ZIP file must have at least one entry

    Hai All,
    I am trying to Burst report in 11.5.10.2 instance. When tried bursting it the it got the following error.
    XML Publisher: Version : 11.5.0
    Copyright (c) 1979, 1999, Oracle Corporation. All rights reserved.
    XDOBURSTREP module: XML Publisher Report Bursting Program
    Current system time is 04-JUN-2009 12:40:16
    XML/BI Publisher Version : 5.6.3
    Request ID: 387463
    All Parameters: ReportRequestID=387460:DebugFlag=Y
    Report Req ID: 387460
    Debug Flag: Y
    Updating request description
    Updated description
    Retrieving XML request information
    Node Name:ERP
    Preparing parameters
    null output =/d02/appluat/uatcomn/admin/out/UAT_erp/o387463.out
    inputfilename =/d02/appluat/uatcomn/admin/out/UAT_erp/o387460.out
    Data XML File:/d02/appluat/uatcomn/admin/out/UAT_erp/o387460.out
    Set Bursting parameters..
    Temp. Directory:/tmp
    [060409_124018651][][STATEMENT] Oracle XML Parser version ::: Oracle XDK Java 9.0.4.0.0 Production
    [060409_124018653][][STATEMENT] setOAProperties called..
    Bursting propertes.....
    {user-variable:cp:territory=US, user-variable:cp:ReportRequestID=387460, user-variable:cp:language=en, user-variable:cp:responsibility=50352, user-variable.OA_MEDIA=http://erp.adgs.ae:8030/OA_MEDIA, burstng-source=EBS, user-variable:cp:DebugFlag=Y, user-variable:cp:parent_request_id=387460, user-variable:cp:locale=en-US, user-variable:cp:user=GVU, user-variable:cp:application_short_name=XDO, user-variable:cp:request_id=387463, user-variable:cp:org_id=103, user-variable:cp:reportdescription=Pension Fund}
    Start bursting process..
    Bursting process complete..
    Generating Bursting Status Report..
    --Exception
    ZIP file must have at least one entry
    java.util.zip.ZipException: ZIP file must have at least one entry
         at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:292)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.zipOutputFiles(JCP4XDOBurstingEngine.java:534)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.runProgram(JCP4XDOBurstingEngine.java:292)
         at oracle.apps.fnd.cp.request.Run.main(Run.java:161)
    Can anyone please help me on this..
    Regards

    Pl help me is there any way to overcome this error, when supplier email address is present then , bursting file works fine, if supplier address is null , then it is giving me error , please find the error also.........
    Bursting XML File ...........
    <?xml version="1.0" encoding="UTF-8"?>
    <xapi:requestset xmlns:xapi="http://xmlns.oracle.com/oxp/xapi">
    <xapi:request select="/XXDBD_POPRPOP_SA/LIST_G_INIT_INFO/G_INIT_INFO/LIST_G_HEADERS/G_HEADERS">
    <xapi:delivery>
    <xapi:email server="mailgate.XXX.com" port="25" from="[email protected]">
    <xapi:message id="emailpo" to="${CP_VENDOR_EMAIL}" cc="[email protected],[email protected]" attachment="true"
    subject="Purchase Order No: ${POH_PO_NUM}">
    Please find attached PO ${POH_PO_NUM}.
    Regards,
    </xapi:message>
    </xapi:email>
    </xapi:delivery>
    <xapi:document output="Purchase Order ${POH_PO_NUM}" output-type="pdf" delivery="emailpo">
    <xapi:template type="rtf" location="xdo://XXDBDPO.XXDBD_POXPRPOP_SA1.en.US/?getSource=true" filter=".//G_HEADERS[CP_VENDOR_EMAIL !='']"></xapi:template>
    </xapi:document>
    </xapi:request>
    </xapi:requestset>
    ERROR Generated from bursting file ............Pl help me...........its urgent .............
    XML/BI Publisher Version : 5.6.3
    Updating request description
    Retrieving XML request information
    Preparing parameters
    Set Bursting parameters..
    Bursting propertes.....
    {user-variable:cp:territory=US, user-variable:cp:ReportRequestID=529232, user-variable:cp:language=en, user-variable:cp:responsibility=20707, user-variable.OA_MEDIA=http://usncx054.XXX.com:8015/OA_MEDIA, burstng-source=EBS, user-variable:cp:DebugFlag=N, user-variable:cp:parent_request_id=529232, user-variable:cp:locale=en-US, user-variable:cp:user=RAJULAT, user-variable:cp:application_short_name=XDO, user-variable:cp:request_id=529233, user-variable:cp:org_id=84, user-variable:cp:reportdescription=DBD Printed Purchase Order Report English, user-variable:cp:Dummy for Data Security=Y}
    Start bursting process..
    Bursting process complete..
    Generating Bursting Status Report..
    --Exception
    ZIP file must have at least one entry
    java.util.zip.ZipException: ZIP file must have at least one entry
    at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304)
    at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.zipOutputFiles(JCP4XDOBurstingEngine.java:534)
    at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.runProgram(JCP4XDOBurstingEngine.java:292)
    at oracle.apps.fnd.cp.request.Run.main(Run.java:157)
    Thanks

  • How to get the entries in a jar/zip file contained within a jar/zip file?

    If I want to list the jar/zip entries in a jar/zip file contained within a jar/zip file how can I do that?
    In order to get to the entry enumeration I need a Zip/JarFile:
    ZipFile zip = new ZipFile("C:/java_dev/Java_dl/java_jdk_commander_v36d.zip");
    // Process the zip file. Close it when the block is exited.
    try {
    // Loop through the zip entries and print the name of each one.
    for (Enumeration list =zip.entries(); list.hasMoreElements(); ) {
    ZipEntry entry = (ZipEntry) list.nextElement();
    System.out.println(entry.getName());
    finally {
    zip.close();
    Zip file "java_jdk_commander_v36d.zip" contains two zip entries:
    1) UsersGuide.zip
    2) JDKcommander.exe
    How to list the entries in "jar:file:/C:/java_dev/Java_dl/java_jdk_commander_v36d.zip!/UsersGuide.zip"?
    The following code:
    URL url = new URL("jar:file:/C:/java_dev/Java_dl/java_jdk_commander_v36d.zip!/UsersGuide.zip");
    JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
    zipFile = (ZipFile)jarConnection.getJarFile();
    would point to "jar:file:/C:/java_dev/Java_dl/java_jdk_commander_v36d.zip", which is no help at all and Class JarURLConnection does not have an enumeration method.
    How can I do this?
    Thanks.
    Andre

    I'm not sure I understand the problem. The difference between a zip and jar file is the manifest file; JarFile is extended from ZipFile and is able to read the manifest, other than that they are the same. Your code
    for (Enumeration list =zip.entries(); list.hasMoreElements(); ) {
    ZipEntry entry = (ZipEntry) list.nextElement();
    System.out.println(entry.getName());
    }is close to what I've use for a jar, below. Why not use the same approach? I don't understand what you're trying to do by using JarURLConnection - it's usually used to read the jar contents.
    String jarName = "";
    JarFile jar = null;
    try
        jar = new JarFile(jarName);
    catch (IOException ex)
        System.out.println("Unable to open jarfile" + jarName);
        ex.printStackTrace();
    for ( Enumeration en = jar.entries() ;  en.hasMoreElements() ;)
        System.out.println(en.nextElement());
    }

  • Reading a Compressed File from a ZIP File, which is an entry of ZIP File

    Hello, Experts,
    Would it be possible somebody to help me with code example for the following problem?
    I want to read a compressed file from a ZIP file, which is an entry of ZIP File, without extacting/writing files on file system. Is this possible?
    Lets say we have a ZipFile1. There is ZipFile2 inside ZipFile1. And inside ZipFile2 is FileA. The scenario is reading FileA without extracting on file system.
    Thank you in advance for your help.
    Cheers
    RADY

    The classes you want to be using are java.util.zip.ZipInputStream and and ZipEntry from the same package. Construct the ZipInputStream with the input you have for the outer zip. Loop with ZipInputStream.getNextEntry until you find the inner zip you're looking for - that method returns a ZipEntry, and you get the name of the zip entry with ZipEntry.getName. Read the ZipInputStream from that point into some buffer, and read that buffer into a new ZipInputStream - rinse and repeat until you have the contents of the file in the zip in the zip...

  • How to write a (g)zip file to disk using NIO

    Hi,
    I want to write some data to a zipped file. I have all data to write to disk in ByteBuffer objects so I want to use NIO. The GZIPOutputstream does not have a getChannel() method. So what is the best method to zip data to file?
    Any comments are welcome!!
    Uli

    Sorry, wrong ByteBuffer in my claspath.
    So why don't you copy the bytes out of it using the get(byte[], int, int) ?

  • In a hurry, I opened an email that said "order was shipped from "ammazon". I downloaded the order document and it ended up being a zip file. I then realized what it was, and did not actually open the file. This was on my Iphone 5. What should I do now!?

    In a hurry, I opened an email that said "order was shipped from "ammazon". I downloaded the order document and it ended up being a zip file. I then realized what it was, and did not actually open the file. This was on my Iphone 5. What should I do now!?

    Delete the email. The zip file will have no effect on your iPhone.

  • Erro in bursting ZIP file must have at least one entry

    Hi All ,
    i am using bursting utility for xmlp report ,but getting the following error
    --Exception
    ZIP file must have at least one entry
    java.util.zip.ZipException: ZIP file must have at least one entry
         at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.zipOutputFiles(JCP4XDOBurstingEngine.java:534)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.runProgram(JCP4XDOBurstingEngine.java:292)
         at oracle.apps.fnd.cp.request.Run.main(Run.java:161)
    i have no clue y this error is coming ,any hint would be very helpful,
    Thanks in advance
    thanks
    Pratap

    Hi All
    i got resolved this error (Erro in bursting ZIP file must have at least one entry) ,was doing very silly mistake i was using the template name instead of Data Definition code name in location string
    location= ' '
    so the ZIP file error is removed ,now getting one more error after this ,which i am not able to under stand
    --Exception
    /tmp/011211_023243126/xdo1_164902_2.pdf (No such file or directory)
    java.io.FileNotFoundException: /tmp/011211_023243126/xdo1_164902_2.pdf (No such file or directory)
         at java.io.FileInputStream.open(Native Method)
         at java.io.FileInputStream.<init>(FileInputStream.java:106)
         at java.io.FileInputStream.<init>(FileInputStream.java:66)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.zipOutputFiles(JCP4XDOBurstingEngine.java:532)
         at oracle.apps.xdo.oa.cp.JCP4XDOBurstingEngine.runProgram(JCP4XDOBurstingEngine.java:299)
         at oracle.apps.fnd.cp.request.Run.main(Run.java:161)
    Please help me on this
    Thanks
    Pratap

  • Java.util.zip.ZipFile.entries() shows only 99 files but zip file is fine.

    Hi,
    I have a wierd issue with java.util.zip.ZipFile
    Code as simple as
    ZipFile file = new ZipFile("my.zip") ;
    System.out.println(file.size());
    For this particular zip file, it says 99 files found but the zip contains more than 60,000 files. I tried the zip with unzip and zip utilities and the zip file checks out fine. I even tried to unzip the contents, and zip 'em up all over again, just to eliminate the chances of corruption while the zip was being transferred over the network.
    The same program works fine with another zip containing more or less the same number of files and prints 63730.
    Any idea? This can not possibly be related to the type of files the zips contain? right? In any case, the contents of both zips are text/xml files.
    Any help would be greatly appreciated.
    Regards,
    ZiroFrequency

    I know its a problem with this particular zip. But whats interesting is that "unzip" can easily open / verify the zip and claims that it is a valid zip.
    As I wrote earlier, I unzipped the file and zipped up the contents again in a new zip but java can't still count the contents correctly.
    So I am thinking there is something to do with the "contents" of the xmls inside the zip? (characterset issues?)
    There are no exceptions thrown and no error anywhere :(
    I basically need to pinpoint the issue so that I can have it corrected upstream as this zip file processing is an ongoing process and I need to resolve it not just once but for the periodic executions.
    Hope this helps explain the issue.

  • A strange problem using the zip files

    I'm currently working on a university project with another student in which we use zip files (using the java ZipFile , and ZipOutputStream classes), we write certain data to a zip file (and verify that it is there by checking the disk). and later we read the zip file, and write it back , appending some data at the end of the file.
    although we see the changes actually take place on the disk , in one of the cases when reading the data we don't see the data we have appended before (although it is physically written on the disk).
    testing has revealed that this has something to do with the rename command or java being unsynchronized with the data actually on the disk (caching problem?).
    we use this code to preform the process:
    ZipFile zf= new ZipFile( ((Integer)lexicon.get(keyword)).intValue()+".zip");
              BufferedInputStream input= new BufferedInputStream(zf.getInputStream(new ZipEntry("data")));
              // create a temporary new zip file.
              ZipOutputStream zipst= new ZipOutputStream(new FileOutputStream( ((Integer)lexicon.get(keyword)).intValue()+".tmp.zip"));
              BufferedOutputStream output =new BufferedOutputStream(zipst);
              zipst.putNextEntry(new ZipEntry("data"));
              // stream the contents of the old file into the new file
              //(we do it this way because of the inability of the java zip file interfaces to add to an existing zip file)
              int current = input.read();
              while(current!=-1){
              output.write(current);
              current = input.read();
              output.write(entry.getBytes(false)); // add the new entrys.
              output.flush();
              zipst.closeEntry();
              output.close();
              // erase the old file.
              File toErase = new File( ((Integer)lexicon.get(keyword)).intValue()+".zip");
              toErase.delete();
              // rename the temporary file to the old files name.
              File toRename = new File( ((Integer)lexicon.get(keyword)).intValue()+".tmp.zip");
              toRename.renameTo(new File( ((Integer)lexicon.get(keyword)).intValue()+".zip"));
    we use:
    1. j2sdk 1.4.2_05
    2. running under libranet linux.
    any help will be appreciated

    the data does indeed get lost in the course fo rewriting the file, e assume this is some sort of synchronization issue with java and the file system.
    addig enteies to an existing zip file would have been great, if we had it a few weeks ago , we had to make do without this ability , and all of the code is already written and mostly working (except for the problem I mention) and we don't really want to rewrite the zip file access.
    additional testing has shown that the data gets lost when we use the rename command.
    very strange...
    thanks for the input

  • Error reading zip file containing an excel file

    Hi all,
    Using servlets I am able to zip an excel file using java.util.zip package. The excel file is created using POI API.
    While I save and extract the zip file on my machine and then open the file in MS Excel. Excel pops a message saying "MS Office Excel has encountered a problem and need to close" and it gives me an option to "Recover my work and restart MS Office Excel". I select the option and then MS Excel does a document recovery and I am able to view my data. I get an excel repair log file saying as follows
    "Microsoft Office Excel File Repair Log
    Errors were detected in file 'C:\Documents and Settings\JohnDoe\Desktop\excel\test.xls'
    The following is a list of repairs:
    Damage to the file was so extensive that repairs were not possible. Excel attempted to recover your formulas and values, but some data may have been lost or corrupted.
    I have attached my servlet code down below I suspect there is a problem with PrintWriter to output or do I need to use OutputStream to write excel data.
    Below is my servlet code:
    import java.io.*;
    import javax.servlet.*;
    import org.apache.log4j.Logger;
    import java.util.*;
    import java.util.zip.*;
    import java.net.*;
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.record.*;
    import org.apache.poi.hssf.util.*;
    public class ZipServlet extends HttpServlet {
         * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
         * javax.servlet.http.HttpServletResponse)
         public void doGet(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
              makeZip(request, response, "GET");
         * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
         protected void doPost(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
                   makeZip(request, response, "POST");
         public void makeZip(HttpServletRequest request, HttpServletResponse response, String methodGetPost) {
              Logger logger = Logger.getLogger(ZipServlet.class);
              try
                   int id=1;
                   ServletContext sc = getServletContext();
         HttpSession session = request.getSession();          
                   ConnectionPoolManager cpm = (ConnectionPoolManager)sc.getAttribute("CONNECTION_POOL_MANAGER");
                   ConnectionPool cp = cpm.getConnectionPool(id);
              createTestExcelZip(request,response,methodGetPost,session);
              } catch (Exception e2) {
         public void createTestExcelZip(HttpServletRequest request, HttpServletResponse response,
                   String methodGetPost,HttpSession session
                   )throws ServletException, IOException
              Logger logger = Logger.getLogger(ZipServlet.class);
              try
              {      //Create an Excel Workbook and placing value "Test" in the first cell
                   HSSFWorkbook wb = new HSSFWorkbook();
                   HSSFSheet sheet = wb.createSheet("new sheet");
                   HSSFCell cell=null;
                   HSSFRow row = sheet.createRow((short) 0);
                   short column = 0;
                   cell = row.createCell(column);
                   cell.setCellValue(new HSSFRichTextString("Test"));
                   HSSFCellStyle fontStyle = wb.createCellStyle();
              HSSFFont f = wb.createFont();
              f.setFontHeight((short) 200);
              f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
              fontStyle.setFont(f);
              cell.setCellStyle(fontStyle);
              response.setContentType("application/zip");
                   response.setHeader("Content-Disposition","attachment; filename=zipExcelRecordFiles.zip;");
                   int BUFFER = 2048;
                   byte buf[]=new byte[300000];
                   ByteArrayOutputStream baos = new ByteArrayOutputStream();
                   ZipOutputStream zos = new ZipOutputStream( baos );
                   ByteArrayInputStream is = null;
                   BufferedInputStream origin = null;
                   byte[] b = null;
                   String fileName = null;
                   b = wb.getBytes();
                   fileName = "testExcelRecords.xls";
                   try
                   is = new ByteArrayInputStream(b);
                   origin = new BufferedInputStream(is, BUFFER);
                   zos.putNextEntry(new ZipEntry(fileName)); // Add ZIP entry to output stream.
              int count;
              while((count = origin.read(buf, 0, BUFFER)) != -1)
              zos.write(buf, 0, count);
              zos.closeEntry(); // Complete the entry
                   is.close();
                   }catch(Exception e)
                        logger.error(e);
                   zos.close();
              PrintWriter pr = response.getWriter();
                   pr.write(baos.toString("ISO-8859-1"));
                   pr.close();
              catch(Exception e)
              logger.error(e);     
         * @see javax.servlet.GenericServlet#destroy()
         public void destroy() {
    Any help would be appreciated.
    Regards
    jdcunha

    Jdcunha,
    I am new to the field but encountered the same problem and recently found a solution. Hope this helps.
    For my project I wanted to create individual Excel 2003 workbooks for each file I created. Excel would give me the same error it gave you when I used the same HSSFWorkbook object. I tried creating a new Workbook object each time, but ran into the same issue.
    I ended up fixing the error by creating a new instance of my write-to-excel class each time I wanted to create a new workbook, instead of just recreating a new HSSFWorkbook object. It works perfectly and the Excel errors don't show. It may also be important to note I used OutputStream, I did not try it with printwriter.

  • Problem with Java and Zip Files

    Hello there everyone. I have a problem with trying to zip up directories with empty folders in them. They zip fine with my code, but according to winzip, the number of files in the archive is incorrect. It's supposed to have a total of 288 files in it, but when it's zipped up, it only says 284. I mention specifically the "empty directories" note because the zipping works fine without empty folders.
    Below is the code for the zip method:
    public static void zip(File[] list, File zipfile, File zipRoot)
         throws IOException {
          if (!zipfile.exists()) {
                   zipfile.createNewFile();
              else if (!zipfile.isFile()) {
                   throw new IOException("The zip file, " + zipfile.getAbsolutePath()
                             + " is not a file.");
              if (list.length == 0) {
                  LOG.error("The list of files to zip up is empty.");
              for (int i = 0; i < list.length; i++) {
                   if (!list.exists()) {
                        throw new IOException("The file or directory, " + list[i].getAbsolutePath()
                                  + " does not exist.");
              FileOutputStream fos = new FileOutputStream(zipfile);
              ZipOutputStream zos = new ZipOutputStream(fos);
              for (int i = 0; i < list.length; i++) {
                   if (LOG.isDebugEnabled())
                        LOG.debug(i + ": " + list[i].getName());
                   String entryName = getRelativeName(list[i], zipRoot);
                   if (list[i].isDirectory()){
                        if (list[i].listFiles().length == 0){
                             ZipEntry entry = new ZipEntry(entryName + "/");
                             zos.putNextEntry(entry);
                   else {
                        ZipEntry ze = new ZipEntry(entryName);
                        zos.putNextEntry(ze);
                        byte[] buffer = new byte[8096];
                        FileInputStream fis = new FileInputStream(list[i]);
                        int read = 0;
                        read = fis.read(buffer);
                        if (LOG.isDebugEnabled())
                        LOG.debug("\tFound " + read + " bytes.");
                        if (read == -1){
                             //empty file, but add it for preservation.
                             //zos.write(buffer,0,0);
                        while (read != -1) {
                             zos.write(buffer, 0, read);
                             read = fis.read(buffer);
                        fis.close();
                        zos.closeEntry();
              zos.close();
    The files look like they're there, but I need the system to be able to determine the number correctly. 
    Here's the interesting thing:  It zips the files, and then when I use the size() method for zip files in java, it says 284 files.  But when I unzip, it says 288 again.  It's like there's files missing when compressed, but when decompressed, they return.  Note that the files are actually there.  If I open the archive in a third party app such as Winzip AND Winrar AND IZarc, they all show 288 files.  Any idea what would make the number of files appear incorrectly in a zip file when zipped by java with the code above?  Thanks in advance.
    - Chris                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    I figured out the problem. When zipping files in windows using winzip, it doesn't explicitly count folders as a "file/folder" as a file in itself. It will create the folders for files to go in, but the folder itself will not be 'counted' when you query the info of the file itself. You have more control of the zip file in java, and can count the folder as a file or not.

  • Cannot extract Zip file with Winzip after zipping with java.util.zip

    Hi all,
    I write a class for zip and unzip the text files together which can be zip and unzip successfully with Java platform. However, I cannot extract the zip file with Winzip or even WinRAR after zipping with Java platform.
    Please help to comment, thanks~
    Below is the code:
    =====================================================================
    package myapp.util;
    import java.io.* ;
    import java.util.TreeMap ;
    import java.util.zip.* ;
    import myapp.exception.UserException ;
    public class CompressionUtil {
      public CompressionUtil() {
        super() ;
      public void createZip(String zipName, String fileName)
          throws ZipException, FileNotFoundException, IOException, UserException {
        FileOutputStream fos = null ;
        BufferedOutputStream bos = null ;
        ZipOutputStream zos = null ;
        File file = null ;
        try {
          file = new File(zipName) ; //new zip file
          if (file.isDirectory()) //check if it is a directory
         throw new UserException("Invalid zip file ["+zipName+"]") ;
          if (file.exists() && !file.canWrite()) //check if it is readonly
         throw new UserException("Zip file is ReadOnly ["+zipName+"]") ;
          if (file.exists()) //overwrite the existing file
         file.delete();
          file.createNewFile();
          //instantiate the ZipOutputStream
          fos = new FileOutputStream(file) ;
          bos = new BufferedOutputStream(fos) ;
          zos = new ZipOutputStream(bos) ;
          this.writeZipFileEntry(zos, fileName); //call to write the file into the zip
          zos.finish() ;
        catch (ZipException ze) {
          throw ze ;
        catch (FileNotFoundException fnfe) {
          throw fnfe ;
        catch (IOException ioe) {
          throw ioe ;
        catch (UserException ue) {
          throw ue ;
        finally {
          //close all the stream and file
          if (fos != null)
         fos.close() ;
          if (bos != null)
         bos.close();
          if (zos != null)
         zos.close();
          if (file != null)
         file = null ;
        }//end of try-catch-finally
      private void writeZipFileEntry(ZipOutputStream zos, String fileName)
          throws ZipException, FileNotFoundException, IOException, UserException {
        BufferedInputStream bis = null ;
        File file = null ;
        ZipEntry zentry = null ;
        byte[] bArray = null ;
        try {
          file = new File(fileName) ; //instantiate the file
          if (!file.exists()) //check if the file is not exist
         throw new UserException("No such file ["+fileName+"]") ;
          if (file.isDirectory()) //check if the file is a directory
         throw new UserException("Invalid file ["+fileName+"]") ;
          //instantiate the BufferedInputStream
          bis = new BufferedInputStream(new FileInputStream(file)) ;
          //Get the content of the file and put into the byte[]
          int size = (int) file.length();
          if (size == -1)
         throw new UserException("Cannot determine the file size [" +fileName + "]");
          bArray = new byte[(int) size];
          int rb = 0;
          int chunk = 0;
          while (((int) size - rb) > 0) {
         chunk = bis.read(bArray, rb, (int) size - rb);
         if (chunk == -1)
           break;
         rb += chunk;
          }//end of while (((int)size - rb) > 0)
          //instantiate the CRC32
          CRC32 crc = new CRC32() ;
          crc.update(bArray, 0, size);
          //instantiate the ZipEntry
          zentry = new ZipEntry(fileName) ;
          zentry.setMethod(ZipEntry.STORED) ;
          zentry.setSize(size);
          zentry.setCrc(crc.getValue());
          //write all the info to the ZipOutputStream
          zos.putNextEntry(zentry);
          zos.write(bArray, 0, size);
          zos.closeEntry();
        catch (ZipException ze) {
          throw ze ;
        catch (FileNotFoundException fnfe) {
          throw fnfe ;
        catch (IOException ioe) {
          throw ioe ;
        catch (UserException ue) {
          throw ue ;
        finally {
          //close all the stream and file
          if (bis != null)
         bis.close();
          if (file != null)
         file = null ;
        }//end of try-catch-finally
    }

    Tried~
    The problem is still here~ >___<
    Anyway, thanks for information sharing~
    The message is:
    Cannot open file: it does not appear to be a valid archive.
    If you downloaded this file, try downloading the file again.
    The problem may be here:
    if (fos != null)
    fos.close() ;
    if (bos != null)
    bos.close();
    if (zos != null)
    zos.close();
    if (file != null)
    file = null ;
    The fos is closed before bos so the last buffer is not
    saved.
    zos.close() is enough.

Maybe you are looking for