Como hacer Zip o UnZip a un archivo en Android
Hola amigos vamos a aprender como hacer un Zip o UnZip a un archivo en Android así que comenzamos.Como crear un Proyecto en Android Studio
Vamos a crear un proyecto en Android estudio para poder continuar con este ejemplo vamos a seguir el siguiente link. (Aquí).Diseño de la aplicación para crear un Zip o UnZip en Android
Vamos a crear el diseño para nuestra aplicación de forma simple para que puedan entenderlo. <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/buttons"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="false"
android:layout_alignParentTop="true"
android:baselineAligned="false">
<Button
android:id="@+id/btnZip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="50"
android:text="Zip"/>
<Button
android:id="@+id/btnUnzip"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="50"
android:text="Unzip" />
</LinearLayout>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Incluir carpeta principal en archivo zip"
android:id="@+id/chkParent"
android:layout_below="@+id/buttons"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:checked="false" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
El diseño nos quedaría de la siguiente forma.y continuamos.
Código para crear un Zip o UnZip en Android
Vamos a continuar con el código para nuestra aplicación. Y de forma muy breve escribiremos el siguiente código.Comenzaremos creando una clase la cual nombraremos como ArchivoHelper con esta realizaremos las acciones que deseamos Zip y UnZip.
Y el código es el siguiente.
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ArchivoHelper {
private static final int BUFFER_SIZE = 8192 ;//2048;
private static String TAG= ArchivoHelper.class.getName().toString();
private static String parentPath ="";
public static boolean zip( String sourcePath, String destinationPath, String destinationFileName, Boolean includeParentFolder) {
new File(destinationPath ).mkdirs();
FileOutputStream fileOutputStream ;
ZipOutputStream zipOutputStream = null;
try{
if (!destinationPath.endsWith("/")) destinationPath+="/";
String destination = destinationPath + destinationFileName;
File file = new File(destination);
if (!file.exists()) file.createNewFile();
fileOutputStream = new FileOutputStream(file);
zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));
if (includeParentFolder)
parentPath=new File(sourcePath).getParent() + "/";
else
parentPath=sourcePath;
zipFile(zipOutputStream, sourcePath);
}
catch (IOException ioe){
Log.d(TAG,ioe.getMessage());
return false;
}finally {
if(zipOutputStream!=null)
try {
zipOutputStream.close();
} catch(IOException e) {
}
}
return true;
}
private static void zipFile(ZipOutputStream zipOutputStream, String sourcePath) throws IOException{
java.io.File files = new java.io.File(sourcePath);
java.io.File[] fileList = files.listFiles();
String entryPath="";
BufferedInputStream input;
for (java.io.File file : fileList) {
if (file.isDirectory()) {
zipFile(zipOutputStream, file.getPath());
} else {
byte data[] = new byte[BUFFER_SIZE];
FileInputStream fileInputStream = new FileInputStream(file.getPath());
input = new BufferedInputStream(fileInputStream, BUFFER_SIZE);
entryPath=file.getAbsolutePath().replace( parentPath,"");
ZipEntry entry = new ZipEntry(entryPath);
zipOutputStream.putNextEntry(entry);
int count;
while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
zipOutputStream.write(data, 0, count);
}
input.close();
}
}
}
public static Boolean unzip(String sourceFile, String destinationFolder) {
ZipInputStream zis = null;
try {
zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile)));
ZipEntry ze;
int count;
byte[] buffer = new byte[BUFFER_SIZE];
while ((ze = zis.getNextEntry()) != null) {
String fileName = ze.getName();
fileName = fileName.substring(fileName.indexOf("/") + 1);
File file = new File(destinationFolder, fileName);
File dir = ze.isDirectory() ? file : file.getParentFile();
if (!dir.isDirectory() && !dir.mkdirs())
throw new FileNotFoundException("Invalid path: " + dir.getAbsolutePath());
if (ze.isDirectory()) continue;
FileOutputStream fout = new FileOutputStream(file);
try {
while ((count = zis.read(buffer)) != -1)
fout.write(buffer, 0, count);
} finally {
fout.close();
}
}
} catch (IOException ioe){
Log.d(TAG,ioe.getMessage());
return false;
} finally {
if(zis!=null)
try {
zis.close();
} catch(IOException e) {
}
}
return true;
}
public static void saveToFile( String destinationPath, String data, String fileName){
try {
new File(destinationPath).mkdirs();
File file = new File(destinationPath+ fileName);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(file,true);
fileOutputStream.write((data + System.getProperty("line.separator")).getBytes());
} catch(FileNotFoundException ex) {
Log.d(TAG, ex.getMessage());
} catch(IOException ex) {
Log.d(TAG, ex.getMessage());
}
}
}
Las funciones en este archivo se explican por sí mismas, pero me gusta explicar breve mente los parámetros para la función zip.
- SourcePath: carpeta que desea comprimir / comprimir.
- DestinationPath: ruta de ubicación donde se guarda el archivo zip.
- DestinationFileName: nombre del archivo zip
- IncludeParentFolder: es cierto, la carpeta superior se guardará en un archivo zip.
- Falso, la carpeta principal ignorará solo los archivos de la carpeta superior que se comprimirán.
Y para terminar con esto agregaremos en el archivo MainActivity.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath();
private String dataPath = SDPath + "/instinctcoder/zipunzip/data/" ;
private String zipPath = SDPath + "/instinctcoder/zipunzip/zip/" ;
private String unzipPath = SDPath + "/instinctcoder/zipunzip/unzip/" ;
final static String TAG = MainActivity.class.getName();
Button btnUnzip, btnZip;
CheckBox chkParent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnUnzip = (Button) findViewById(R.id.btnUnzip);
btnUnzip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ArchivoHelper.unzip(zipPath + "dummy.zip",unzipPath)) {
Toast.makeText(MainActivity.this,"Unzip successfully.",Toast.LENGTH_LONG).show();
}
}
});
chkParent = (CheckBox) findViewById(R.id.chkParent);
btnZip = (Button) findViewById(R.id.btnZip);
btnZip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ArchivoHelper.zip(dataPath, zipPath, "dummy.zip", chkParent.isChecked())){
Toast.makeText(MainActivity.this,"Zip successfully.",Toast.LENGTH_LONG).show();
}
}
});
//Create dummy files
ArchivoHelper.saveToFile(dataPath,"This is dummy data 01", "Dummy1.txt");
ArchivoHelper.saveToFile(dataPath,"This is dummy data 02", "Dummy2.txt");
ArchivoHelper.saveToFile(dataPath,"This is dummy data 03", "Dummy3.txt");
}
}
y listo.
No hay comentarios:
Publicar un comentario