Blog para desarrollo de aplicaciones en Android, aprende paso a paso como crear aplicaciones.

Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus h谩bitos de navegaci贸n para mostrarle publicidad personalizada y realizar an谩lisis de uso de nuestro sitio.
Si contin煤a navegando consideramos que acepta su uso. OK M谩s informaci贸n | Y m谩s

馃殌 C贸mo crear y extraer archivos ZIP (Zip / UnZip) en Android usando Java y Android Studio

En este tutorial aprender谩s paso a paso c贸mo comprimir y descomprimir archivos ZIP en Android utilizando Java.
Este ejemplo es ideal para quienes est谩n iniciando en la gesti贸n de archivos en Android, y desean comprender c贸mo manipular carpetas, crear archivos y trabajar con compresi贸n ZIP.


馃摌 Contenido del Tutorial

  1. Crear un proyecto en Android Studio

  2. Dise帽o de la aplicaci贸n

  3. Clase ArchivoHelper para crear ZIP y extraer ZIP

  4. C贸digo de MainActivity

  5. Permisos necesarios

  6. Probar la aplicaci贸n en un emulador AVD

  7. Preguntas frecuentes (FAQ)


馃洜️ Crear un nuevo proyecto en Android Studio

  1. Abre Android Studio

  2. Selecciona New Project → Empty Activity

  3. Usa Java como lenguaje de programaci贸n

  4. Asigna un nombre a tu proyecto, por ejemplo:
    ZipUnzipAndroid

Con esto ya tendremos la base para trabajar.


馃帹 Dise帽o de la aplicaci贸n (Layout XML)

Este dise帽o ser谩 sencillo: dos botones (Zip y Unzip) y un CheckBox para decidir si incluir la carpeta ra铆z dentro del ZIP.

Copia este c贸digo en res/layout/activity_main.xml:

<?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="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnZip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Zip"/> <Button android:id="@+id/btnUnzip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Unzip"/> </LinearLayout> <CheckBox android:id="@+id/chkParent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Incluir carpeta principal en ZIP" android:layout_below="@+id/buttons" android:layout_marginTop="20dp"/> </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>

馃摝 C贸digo para crear y extraer ZIP en Android

Toda la l贸gica ser谩 manejada por una clase llamada ArchivoHelper, que se encargar谩 de:

✔ Comprimir carpetas o archivos
✔ Extraer archivos ZIP
✔ Crear archivos de texto dummy
✔ Manejar rutas y excepciones

Crea un archivo llamado ArchivoHelper.java y pega lo 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; private static String TAG = ArchivoHelper.class.getName(); private static String parentPath = ""; public static boolean zip(String sourcePath, String destinationPath, String destinationFileName, Boolean includeParentFolder) { new File(destinationPath).mkdirs(); ZipOutputStream zipOutputStream = null; try { if (!destinationPath.endsWith("/")) destinationPath += "/"; String destination = destinationPath + destinationFileName; File file = new File(destination); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file); zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream)); parentPath = includeParentFolder ? new File(sourcePath).getParent() + "/" : sourcePath; zipFile(zipOutputStream, sourcePath); } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zipOutputStream != null) zipOutputStream.close(); } catch (IOException ignore) {} } return true; } private static void zipFile(ZipOutputStream zipOutputStream, String sourcePath) throws IOException { File files = new File(sourcePath); File[] fileList = files.listFiles(); for (File file : fileList) { if (file.isDirectory()) { zipFile(zipOutputStream, file.getPath()); } else { byte[] data = new byte[BUFFER_SIZE]; BufferedInputStream input = new BufferedInputStream(new FileInputStream(file.getPath()), BUFFER_SIZE); String entryPath = file.getAbsolutePath().replace(parentPath, ""); ZipEntry entry = new ZipEntry(entryPath); zipOutputStream.putNextEntry(entry); int count; while ((count = input.read(data)) != -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; 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(); if (ze.isDirectory()) continue; FileOutputStream fout = new FileOutputStream(file); int count; while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); fout.close(); } } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zis != null) zis.close(); } catch (IOException ignore) {} } 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.lineSeparator()).getBytes()); } catch (IOException ex) { Log.d(TAG, ex.getMessage()); } } }

馃帥️ Clase MainActivity

Aqu铆 conectamos los botones del layout con las funciones ZIP/UNZIP.

Copia este c贸digo en MainActivity.java:

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Environment; 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/"; Button btnUnzip, btnZip; CheckBox chkParent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnUnzip = findViewById(R.id.btnUnzip); btnZip = findViewById(R.id.btnZip); chkParent = findViewById(R.id.chkParent); btnUnzip.setOnClickListener(v -> { if (ArchivoHelper.unzip(zipPath + "dummy.zip", unzipPath)) { Toast.makeText(MainActivity.this, "Unzip realizado con 茅xito.", Toast.LENGTH_LONG).show(); } }); btnZip.setOnClickListener(v -> { if (ArchivoHelper.zip(dataPath, zipPath, "dummy.zip", chkParent.isChecked())) { Toast.makeText(MainActivity.this, "Zip creado con 茅xito.", Toast.LENGTH_LONG).show(); } }); // Crear archivos de prueba (dummy) ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 01", "Dummy1.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 02", "Dummy2.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 03", "Dummy3.txt"); } }

馃攼 Permisos necesarios

Agrega este permiso en tu archivo AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

En Android 10+ deber谩s pedir el permiso en tiempo de ejecuci贸n (Runtime Permission).


馃摫 Probar la aplicaci贸n en un emulador AVD

  1. Crea un emulador AVD desde Android Studio

  2. Ejecuta tu proyecto

  3. Prueba comprimir archivos y extraerlos dentro del emulador


馃И Resultado Final

✔ Tendr谩s un ZIP creado desde tus propios archivos
✔ Podr谩s extraerlo en la ubicaci贸n que definas
✔ Aprender谩s a manejar directorios, archivos y flujos de entrada/salida
✔ Ideal para aprender gesti贸n de archivos avanzada en Android


❓ Preguntas frecuentes (FAQ)

1. ¿Necesito permisos especiales para crear ZIP o extraer ZIP?

S铆, necesitas el permiso WRITE_EXTERNAL_STORAGE para trabajar con almacenamiento externo.

2. ¿Puedo trabajar solo con almacenamiento interno?

S铆. Puedes usar getFilesDir() y no necesitar谩s permisos.

3. ¿Se puede modificar para comprimir solo archivos espec铆ficos?

S铆, solo debes procesar los archivos que desees antes de pasarlos al m茅todo zip().

4. ¿Android permite descomprimir ZIP con subcarpetas?

S铆, el c贸digo soporta subcarpetas sin problema.

No hay comentarios:

Publicar un comentario