Explaining along with the code snippet would be better+smarter+shortcut, and 'm practising the same below ;-)
package
org.sample.example.download;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.net.URL;
import
java.net.URLConnection;
import
java.util.zip.ZipEntry;
import
java.util.zip.ZipInputStream;
import
android.content.Context;
import
android.util.Log;
public
class
UnzipManager {
private
static
String BASE_FOLDER;
public
static
Context localContext;
/*
*You can use this flag to check whether Unzipping
*thread is still running..
*/
public
static
boolean
isDownloadInProgress;
/*
* After unzipping using this flag ,you can check
* whether any low memory exceptions
* Occurred or not..and alert user accordingly..
*/
public
static
boolean
isLowOnMemory;
public
static
void
startUnzipping()
{
/*
* MAKE SURE THAT localContext VARIABLE HAS BEEN
* INITIALIZED BEFORE INVOKING THIS METHOD.
*
* ALSO MAKE SURE YOU HAVE SET "INTERNET" AND
* "NETWORK ACCESS STATE" PERMISSIONS IN
* APPLICATION'S MANIFEST FILE.
*
*/
Log.d("DEBUG","In
startUnzipping()");
UnzipManager.BASE_FOLDER=UnzipManager.localContext.getFilesDir().getPath();
/*
*
*/
Log.d("DEBUG","BASE_FOLDER:"+UnzipManager.BASE_FOLDER);
UnzipManager.isLowOnMemory=false;
//Start
unzipping
in a thread..which is safer
//way
to do high cost processes..
new
UnzipThread().start();
}
private
static
class
UnzipThread extends
Thread{
@Override
public
void
run()
{
UnzipManager.isDownloadInProgress=true;
Log.d("DEBUG","Unzipping----------------------------");
URLConnection urlConnection
;
try
{
/************************************************
*
* IF you are unzipping
a zipped file save under
* some URL in remote
server
*
**********************************************/
URL finalUrl =new
URL("http://www.temp.org/folder1/file_name.zip"
/*
Url
string where the zipped
file is stored...*/);
urlConnection = finalUrl.openConnection();
//Get the size of the (
zipped
file's) inputstream
from server..
int
contentLength=urlConnection.getContentLength();
Log.d("DEBUG",
"urlConnection.getContentLength():"+contentLength);
/*****************************************************
*
* YOU CAN GET INPUT STREAM OF A ZIPPED FILE FROM
* ASSETS FOLDER AS WELL..,IN THAT CASE JUST PASS THAT
* INPUTSTEAM OVER HERE...MAKE SURE YOU
* HAVE SET STREAM CONTENT LENGTH OF THE SAME..
*
******************************************************/
ZipInputStream zipInputStream = new ZipInputStream(urlConnection.getInputStream());
/*
* Iterate over all the
files and folders
*/
for
(ZipEntry zipEntry = zipInputStream.getNextEntry();
zipEntry != null;
zipEntry = zipInputStream.getNextEntry())
{
Log.d("DEBUG","Extracting:
" + zipEntry.getName() + "...");
/*
* Extracted file will
be saved with same
* file name that in
zipped folder.
*/
String innerFileName
= BASE_FOLDER
+ File.separator
+ zipEntry.getName();
File innerFile = new
File(innerFileName);
/*
* Checking for
pre-existence of the file and
* taking necessary
actions
*/
if
(innerFile.exists())
{
Log.d("DEBUG","The
Entry already exits!, so deleting..");
innerFile.delete();
}
/*
* Checking for
extracted entry for folder
* type..and taking
necessary actions
*/
if
(zipEntry.isDirectory())
{
Log.d("DEBUG","The
Entry is a directory..");
innerFile.mkdirs();
}
else
{
Log.d("DEBUG","The
Entry is a file..");
FileOutputStream
outputStream = new
FileOutputStream(innerFileName);
final
int
BUFFER_SIZE = 2048;
/*
* Get the
buffered output stream..
*
*/
BufferedOutputStream
bufferedOutputStream =
new
BufferedOutputStream(outputStream,BUFFER_SIZE);
/*
* Write into
the file's buffered output stream ,..
*/
int
count = 0;
byte[]
buffer = new
byte[BUFFER_SIZE];
while
((count = zipInputStream.read(buffer, 0, BUFFER_SIZE)) != -1)
{
bufferedOutputStream.write(buffer,
0, count);
}
/***********************************************
* IF YOU WANT
TO TRACK NO OF FILES DOWNLOADED,
* HAVE A STATIC
COUNTER VARIABLE, INITIALIZE IT
* IN
startUnzipping() before calling startUnZipping(),
* AND INCREMENT
THE COUNTER VARIABLE
* OVER
HERE..LATER YOU CAN USE VALUE OF
* COUNTER
VARIABLE TO CROSS VERIFY WHETHER ALL
* ZIPPED FILES
PROPERLY UNZIPPED AND SAVED OR NOT.
*
*
************************************************
*/
/*
* Handle
closing of output streams..
*/
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
/*
* Finish the
current zipEntry
*/
zipInputStream.closeEntry();
}
/*
* Handle closing of
input stream...
*/
zipInputStream.close();
Log.d("DEBUG","--------------------------------");
Log.d("DEBUG","Unzipping
completed..");
}
catch
(IOException e)
{
Log.d("DEBUG","Exception
occured: " + e.getMessage());
if(e.getMessage().equalsIgnoreCase("No
space left on device"))
{
UnzipManager.isLowOnMemory=true;
}
e.printStackTrace();
}
UnzipManager.isDownloadInProgress=false;
}
};
}
I have studied unzipping a file from here.
Happy coding guys :)
.
Thanks.........
ReplyDelete-Anuj