/*
 * [TestZipReadRandom.java]
 *
 * Summary: Example to read the elements of a Zip file randomly by name lookup.
 *
 * Copyright: (c) 2009-2017 Roedy Green, Canadian Mind Products, http://mindprod.com
 *
 * Licence: This software may be copied and used freely for any purpose but military.
 *          http://mindprod.com/contact/nonmil.html
 *
 * Requires: JDK 1.8+
 *
 * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/
 *
 * Version History:
 *  1.0 2008-06-06
 */
package com.mindprod.example;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import static java.lang.System.*;

/**
 * Example to read the elements of a Zip file randomly by name lookup.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2008-06-06
 * @since 2008-06-06
 */
public final class TestZipReadRandom
    {
    /**
     * read the elements of a Zip file sequentially.
     *
     * @param args not used
     *
     * @throws java.io.IOException if problems writing file a.zip
     */
    public static void main( String[] args ) throws IOException
        {
        // specify the name of the zip we are going to read
        final String zipFileName = "in.zip";
        // specify internal directory structure and file name to read from zip.
        final String elementName = "com/mindprod/batik/run.bat";
        // specify the name of the directory where extracted data will go.
        final String targetdir = "targetdir";
        // look up that entry in the zip
        final ZipFile zip = new ZipFile( zipFileName );
        final ZipEntry entry = zip.getEntry( elementName );
        // length should be ok, even for stream-created zips and jars.
        final int fileLength = ( int ) entry.getSize();
        final byte[] wholeFile = new byte[ fileLength ];
        // read element contents.
        final InputStream is = zip.getInputStream( entry );
        final int bytesRead = is.read( wholeFile, 0, fileLength );
        // checking bytesRead, and repeating if you don't get item all is not shown.
        out.println( bytesRead + " bytes read from " + elementName );
        // write contents of element from RAM to a file.
        // Where we will put the external file.
        final File elementFile = new File( targetdir, elementName );
        // make sure dirs exist to hold the external file we are about to create.
        //noinspection ResultOfMethodCallIgnored
        elementFile.getParentFile().mkdirs();
        final FileOutputStream fos = new FileOutputStream( elementFile );
        fos.write( wholeFile, 0, fileLength );
        fos.close();
        elementFile.setLastModified( entry.getTime() );
        // no need for a zip.closeEntry()
        zip.close();
        }
    }