Saturday 5 December 2015

How to programmatically extract the zip file using Java ?

This article is about how to write a utility class for extracting files and directories in a compressed zip archive, using built-in Java API.
The java.util.zip package provides the following classes for extracting files and directories from a ZIP archive:
    • ZipInputStream: this is the main class which can be used for reading zip file and extracting files and directories (entries) within the archive. Here are some important usages of this class:
      • read a zip via its constructor ZipInputStream(FileInputStream)
      • read entries of files and directories via method getNextEntry()
      • read binary data of current entry via method read(byte)
      • close current entry via method closeEntry()
      • close the zip file via method close()
       
    • ZipEntry: this class represents an entry in the zip file. Each file or directory is represented as a ZipEntry object. Its method getName() returns a String which represents path of the file/directory. The path is in the following form:
      folder_1/subfolder_1/subfolder_2/…/subfolder_n/file.ext
       
Based on the path of a ZipEntry, we re-create directory structure when extracting the zip file. In addition, the BufferedOutputStream class is used to write content of the current ZipEntry to a file on disk, via its method write(byte[] bytes, int offset, int length). Following is source code of UnzipUtility.java class:

import java.io.BufferedOutputStream;
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.ZipInputStream;
 
/**
 * This utility extracts files and directories of a standard zip file to
 * a destination directory.
 * @author www.codejava.net
 *
 */
public class UnzipUtility {
    /**
     * Size of the buffer to read/write data
     */
    private static final int BUFFER_SIZE = 4096;
    /**
     * Extracts a zip file specified by the zipFilePath to a directory specified by
     * destDirectory (will be created if does not exists)
     * @param zipFilePath
     * @param destDirectory
     * @throws IOException
     */
    public void unzip(String zipFilePath, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                // if the entry is a file, extracts it
                extractFile(zipIn, filePath);
            } else {
                // if the entry is a directory, make the directory
                File dir = new File(filePath);
                dir.mkdir();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
    }
    /**
     * Extracts a zip entry (file entry)
     * @param zipIn
     * @param filePath
     * @throws IOException
     */
    private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = zipIn.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
    }
}

How to download a zip file using Java code?

Below is the code snippet that will show you how to download the zip file from any url and save it to your local machine using java code.


import java.net.*;
import java.io.*;
 
public class URLConnectionReader {
    public void download_zip_file(String save_to) {
        URL url = new URL("http://pc-2011.com/downloads/test.zip");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        InputStream in = connection.getInputStream();
        FileOutputStream out = new FileOutputStream("test.zip");
        copy(in, out, 1024);
        out.close();
    }
 
    public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
        byte[] buf = new byte[bufferSize];
        int n = input.read(buf);
        while (n >= 0) {
            output.write(buf, 0, n);
            n = input.read(buf);
        }
        output.flush();
    }
}

Saturday 31 October 2015

How to perform a join on two foreign keys from the same table

Let me describe the scenario in little more details.

Lets say i have a Taxi and Location Table.
Taxi table has 2 columns "startLocationId" and "endLocationId". Both these columns are foreign key to Location table.

Now while printing the results of Taxi Table, I want to print the Location Name and not just Location Id.

Here is the query.

select t.TaxiNo, l1.LocationName as "startLocation", l2.LocationName as "endLocation" from Taxi t join Location l1 on t.startLocationId=l1.locationId join Location l2 on t.endLocationId=l2.LocationId

Monday 7 September 2015

How to downgrade your Xperia T2 Ultra Lolipop to Android Kitkat

I was facing very bad experience in using my Sony Xperia T2 ultra phone after i upgraded it to Lolipop version.

The phone was pathetically working slow. I wanted to go back to factory version of this.

If you wish to do the same, here are the below steps and then a you tube video from external source to show how these steps can be followed.

1. Download Flashtool from
https://drive.google.com/file/d/0B1AAC4lt7nzOQzR3aTZKUFZqem8/view?usp=sharing

2. Download Kitkat 4.4.3 from
https://drive.google.com/file/d/0B1oU02TyhZkAVTBvUU9MamRQZzg/edit

3. Copy above downloaded kitkat 4.4.3 file to C:\users\<username>\.flashtools\firmwares

4. Start Flash Tool.

5. Wait for any pending things to be completed in flash tool.

6. Click on left most button (which looks like zigzag spike). This will start the flash mode.

7. Now select the file which would be the one we just copied to flashtool directory.

8. Start the flashing. Wait for some time. Follow the onscreen instructions. When asked to press the back button, press the volume down key.

9. Wait for flashing to complete.

10. Disconnect and restart the phone.

Below is the youtube video to explain the above process