/*
 * [TestZipWrite.java]
 *
 * Summary: Example to create a Zip file with one element.
 *
 * 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.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import static java.lang.System.*;

/**
 * Example to create a Zip file with one element.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2008-06-06
 * @since 2008-06-06
 */
public final class TestZipWrite
    {
    /**
     * create a Zip file with one element.
     *
     * @param args not used
     *
     * @throws java.io.IOException if problems writing file out.zip
     */
    @SuppressWarnings( { "UnusedAssignment" } )
    public static void main( String[] args ) throws IOException
        {
        // create a zip file with one element
        // specify the name of the zip file.
        final String zipFilename = "out.zip";
        // get the element file we are going to add, using slashes in name.
        final String elementName = "mydir/test.txt";
        // Open the Zip
        final FileOutputStream fos = new FileOutputStream( zipFilename );
        final ZipOutputStream zip = new ZipOutputStream( fos );
        zip.setLevel( 9 );
        zip.setMethod( ZipOutputStream.DEFLATED );
        // external file
        final File elementFile = new File( elementName );
        // create the entry
        final ZipEntry entry = new ZipEntry( elementName );
        entry.setTime( elementFile.lastModified() );
        // read contents of file external file we are going to put in the zip
        final int fileLength = ( int ) elementFile.length();
        final FileInputStream fis = new FileInputStream( elementFile );
        final byte[] wholeFile = new byte[ fileLength ];
        final int bytesRead = fis.read( wholeFile, 0/* offset */, fileLength );
        // checking bytesRead to ensure all read not shown.
        out.println( bytesRead + " bytes read from " + elementName );
        fis.close();
        // no need to setCRC, or setSize as they are computed automatically.
        zip.putNextEntry( entry );
        // write the contents directly into the zip just after the zip element
        zip.write( wholeFile, 0, fileLength );
        zip.closeEntry();
        // close the entire zip
        zip.close();
        }
    }