Files & Compression · jdashboardUI · B4J · Zip4j 2.11.6
ZipFile es el servicio ZIP de jdashboardUI. Está construido sobre Zip4j 2.11.6 y ofrece una API B4J para crear, modificar, leer, cifrar, extraer e inspeccionar archivos ZIP.
ZipFileHeader es su clase acompañante: representa una entrada concreta dentro del ZIP y expone su nombre, tamaños, CRC, método de compresión, estado de cifrado, fecha y otros metadatos.
Los dos módulos se documentan juntos porque se usan como una sola unidad:
ZipFile
└── FileNames / getFileName(...)
└── ZipFileHeader
Características destacadas
- Crear ZIP y añadir uno o varios archivos.
- Añadir carpetas completas conservando estructura.
- SmartCompression: usa
STOREpara formatos que ya están comprimidos. - Niveles de compresión desde
NO_COMPRESSIONhastaULTRA. - Cifrado AES y ZIP_STANDARD.
- Ejemplo incluido para AES 256-bit.
- Extraer todo el ZIP o solamente una entrada.
- Leer texto o bytes directamente desde el ZIP sin extraerlos.
- Obtener un
InputStreamde una entrada. - Añadir datos desde un
InputStream. - Renombrar y eliminar entradas dentro del ZIP.
- Comentario global del archivo ZIP.
- Charset configurable para nombres y comentarios.
- Detectar archivos ZIP cifrados.
- Validar la integridad estructural del ZIP.
- Detectar ZIP divididos y fusionarlos.
- Ejecución en segundo plano mediante
RunInThread. - Progreso, archivo actual, tarea actual, bytes procesados, pausa, reanudación y cancelación.
- Estadísticas: archivos, directorios, tamaño comprimido/no comprimido y ratio.
- Acceso al objeto nativo Zip4j mediante
Obj. - Inspección de entradas con
ZipFileHeader.
Dependencia
El manifiesto de jdashboardUI.b4xlib declara:
zip4j-2.11.6.jar
Por tanto, la implementación está basada específicamente en Zip4j 2.11.6.
Si B4J informa que no encuentra esa dependencia, asegúrate de que zip4j-2.11.6.jar esté disponible en las librerías adicionales de tu instalación.
Inicialización básica
Private Zip As ZipFile
Private Sub CreateArchive
Dim ZipPath As String = File.Combine(File.DirApp, "backup.zip")
Zip.Initialize(ZipPath)
End Sub
El archivo ZIP se crea cuando se añade la primera entrada.
ZIP protegido con contraseña
Private Zip As ZipFile
Private Sub OpenEncryptedArchive
Dim ZipPath As String = File.Combine(File.DirApp, "secure.zip")
Zip.InitializeWithPassword(ZipPath, "Secret123")
End Sub
También puedes establecer o cambiar la contraseña después:
Zip.SetPassword("Secret123")
Propiedades B4X de ZipFile
Los accesores públicos getX/setX compatibles se documentan como propiedades B4X normales.
| Propiedad | Acceso | Tipo | Uso |
|---|---|---|---|
| Obj | lectura | Object | Objeto nativo net.lingala.zip4j.ZipFile |
| Obj2 | lectura | Object | Alias del objeto nativo |
| RunInThread | lectura / escritura | Boolean | Ejecuta operaciones Zip4j en segundo plano |
| SmartCompression | lectura / escritura | Boolean | Activa selección STORE/DEFLATE |
| LastError | lectura | String | Último error registrado |
| HasError | lectura | Boolean | True si LastError no está vacío |
| Comment | lectura / escritura | String | Comentario global del ZIP |
| FileNames | lectura | List | Lista de ZipFileHeader, no Strings |
| FileHeaders | lectura | List | Lista nativa de FileHeader de Zip4j |
| ProgressMonitor | lectura | Object | Monitor nativo de progreso |
| IsBusy | lectura | Boolean | Operación asíncrona activa |
| ProgressPercent | lectura | Int | Porcentaje 0–100 |
| ProgressFile | lectura | String | Archivo actual |
| ProgressTask | lectura | String | Tarea actual |
| ProgressState | lectura | String | Estado del monitor |
| ProgressResult | lectura | String | Resultado de la operación |
| ProgressTotalWork | lectura | Long | Trabajo total en bytes |
| ProgressCompletedWork | lectura | Long | Trabajo realizado en bytes |
| ProgressError | lectura | String | Error del trabajo asíncrono |
| IsPaused | lectura | Boolean | Operación pausada |
| FileCount | lectura | Int | Número de archivos |
| DirectoryCount | lectura | Int | Número de directorios |
| TotalUncompressedSize | lectura | Long | Tamaño original total |
| TotalCompressedSize | lectura | Long | Tamaño comprimido total |
| CompressionRatio | lectura | Double | Comprimido / original × 100 |
Ejemplo:
Zip.SmartCompression = True
Zip.RunInThread = False
Log(Zip.FileCount)
Log(Zip.TotalCompressedSize)
Log(Zip.HasError)
LastError y HasError
Muchas operaciones capturan excepciones y las guardan:
If Zip.HasError Then
Log(Zip.LastError)
End If
Para limpiar el estado:
Zip.ClearError
Añadir un archivo
La forma simple:
Zip.addFile(File.Combine(File.DirApp, "report.pdf"))
La forma configurable:
Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_HIGHER)
Dim Ok As Boolean = Zip.AddFile2( _
File.Combine(File.DirApp, "report.pdf"), _
Opt)
If Ok = False Then
Log(Zip.LastError)
End If
addFile llama internamente a AddFile2 con las opciones predeterminadas.
Añadir varios archivos
Dim Files As List
Files.Initialize
Files.Add(File.Combine(File.DirApp, "a.txt"))
Files.Add(File.Combine(File.DirApp, "b.txt"))
Files.Add(File.Combine(File.DirApp, "photo.jpg"))
Zip.addFiles(Files)
Con opciones:
Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_ULTRA)
If Zip.AddFiles2(Files, Opt) = False Then
Log(Zip.LastError)
End If
Nota sobre SmartCompression y AddFiles2
En la implementación actual, AddFiles2 crea un único ZipParameters para toda la lista. No evalúa ShouldStore archivo por archivo.
Por eso, si necesitas SmartCompression real para formatos mezclados, usa AddFile2 individualmente o comprime una carpeta mediante AddFolderSmart / AddFolder2 con Smart activo.
Añadir carpetas
Forma simple:
Zip.AddFolder(File.DirApp, "data")
Equivale a añadir:
File.Combine(File.DirApp, "data")
Con opciones
Dim Opt As Map = Zip.CreateOptions
Opt.Put("IncludeRootFolder", True)
Dim Ok As Boolean = Zip.AddFolder2( _
File.Combine(File.DirApp, "data"), _
Opt)
SmartCompression para una carpeta
Zip.SmartCompression = True
If Zip.AddFolderSmart(File.Combine(File.DirApp, "assets")) = False Then
Log(Zip.LastError)
End If
En modo Smart, el wrapper recorre la carpeta, conserva las rutas relativas y decide el método de compresión por archivo.
Los directorios realmente vacíos también son agregados como entradas del ZIP.
SmartCompression
Actívalo globalmente:
Zip.SmartCompression = True
o mediante opciones:
Dim Opt As Map = Zip.CreateOptions
Opt.Put("Smart", True)
ShouldStore identifica como ya comprimidos estos formatos:
.zip .7z .rar .gz .jar
.png .jpg .jpeg .webp .gif
.mp3 .aac .ogg
.mp4 .mkv .webm
.woff .woff2
Para ellos usa STORE; para los demás usa DEFLATE.
Puedes consultar la decisión:
If Zip.ShouldStore("photo.jpg") Then
Log("No conviene volver a comprimirlo")
End If
Smart folder + ejecución asíncrona
La implementación de carpeta Smart añade las entradas una por una.
Por ese motivo, para un flujo predecible es recomendable usar AddFolderSmart de forma síncrona. Si necesitas una sola operación de carpeta en segundo plano, usa el modo nativo de carpeta sin Smart.
Niveles de compresión
Constantes públicas:
| Constante |
|---|
| LEVEL_NO_COMPRESSION |
| LEVEL_FASTEST |
| LEVEL_FASTER |
| LEVEL_FAST |
| LEVEL_MEDIUM_FAST |
| LEVEL_NORMAL |
| LEVEL_HIGHER |
| LEVEL_MAXIMUM |
| LEVEL_PRE_ULTRA |
| LEVEL_ULTRA |
Ejemplo:
Dim Opt As Map = Zip.CreateOptions
Opt.Put("CompressionLevel", Zip.LEVEL_NORMAL)
Zip.AddFile2(File.Combine(File.DirApp, "database.db"), Opt)
CreateOptions usa LEVEL_ULTRA como nivel predeterminado.
Si el nombre del nivel no existe, CreateZipParameters intenta volver a ULTRA.
CreateOptions
Dim Opt As Map = Zip.CreateOptions
Valores predeterminados generados por el wrapper:
| Clave | Predeterminado |
|---|---|
| IncludeRootFolder | False |
| CompressionLevel | LEVEL_ULTRA |
| CompressionMethod | DEFLATE |
| Smart | valor actual de SmartCompression |
| OverrideExistingFilesInZip | True |
| ReadHiddenFiles | True |
| ReadHiddenFolders | True |
Puedes añadir otras opciones compatibles antes de llamar a AddFile2, AddFiles2, AddFolder2 o AddStream.
Opciones avanzadas admitidas
CreateZipParameters reconoce estas claves:
| Clave | Uso |
|---|---|
| CompressionMethod | STORE o DEFLATE |
| CompressionLevel | Una constante LEVEL_* |
| IncludeRootFolder | Incluye la carpeta raíz |
| RootFolderNameInZip | Nombre/ruta raíz dentro del ZIP |
| OverrideExistingFilesInZip | Reemplaza entradas existentes |
| EncryptFiles | Activa cifrado |
| EncryptionMethod | AES o ZIP_STANDARD |
| AesKeyStrength | Fuerza de clave AES |
| ReadHiddenFiles | Incluye archivos ocultos |
| ReadHiddenFolders | Incluye carpetas ocultas |
| SymbolicLinkAction | Acción de enlaces simbólicos |
| UnixMode | Modo Unix |
| LastModifiedFileTime | Timestamp de la entrada |
| WriteExtendedLocalFileHeader | Header local extendido |
| FileNameInZip | Ruta/nombre exacto de la entrada |
| FileComment | Comentario de la entrada |
Para acceso aún más bajo nivel:
Dim NativeParams As JavaObject = Zip.CreateZipParameters(Opt)
Añadir un archivo dentro de una carpeta del ZIP
Zip.AddFileToFolder( _
File.Combine(File.DirApp, "logo.png"), _
"assets/images")
Varios archivos:
Zip.AddFilesToFolder(Files, "documents")
Una carpeta completa dentro de otra ruta:
Zip.AddFolderToFolder( _
File.Combine(File.DirApp, "web"), _
"backups/v1")
Añadir un InputStream
Para streams es recomendable usar AddStream2, porque obliga a definir el nombre de la entrada:
Dim In As InputStream = File.OpenInput(File.DirApp, "settings.json")
Dim Opt As Map = Zip.CreateOptions
If Zip.AddStream2(In, "config/settings.json", Opt) = False Then
Log(Zip.LastError)
End If
In.Close
AddStream también es público, pero las opciones deben contener FileNameInZip:
Dim Opt As Map = Zip.CreateOptions
Opt.Put("FileNameInZip", "config/settings.json")
Zip.AddStream(In, Opt)
Cifrado AES
Ejemplo completo:
Dim Zip As ZipFile
Dim ZipPath As String = File.Combine(File.DirApp, "secure.zip")
Zip.InitializeWithPassword(ZipPath, "Secret123")
Dim Opt As Map = Zip.CreateOptions
Opt.Put("EncryptFiles", True)
Opt.Put("EncryptionMethod", "AES")
Opt.Put("AesKeyStrength", "KEY_STRENGTH_256")
If Zip.AddFile2(File.Combine(File.DirApp, "private.pdf"), Opt) = False Then
Log(Zip.LastError)
End If
El valor KEY_STRENGTH_256 está utilizado por la propia implementación en saveZipCPassword.
ZIP Standard
Dim Opt As Map = Zip.CreateOptions
Opt.Put("EncryptFiles", True)
Opt.Put("EncryptionMethod", "ZIP_STANDARD")
Zip.AddFile2(File.Combine(File.DirApp, "private.txt"), Opt)
Si EncryptionMethod no es exactamente ZIP_STANDARD, el wrapper selecciona AES.
saveZipCPassword
Existe el helper heredado:
Zip.saveZipCPassword(ZipPath, Files, "Secret123")
Internamente crea otro ZipFile, usa AES y KEY_STRENGTH_256.
Para código nuevo es preferible usar explícitamente:
InitializeWithPassword
+ CreateOptions
+ EncryptFiles
+ AddFile2 / AddFiles2
porque así puedes comprobar directamente el Boolean de retorno y LastError.
Extraer todo
Zip.ExtractAll(File.Combine(File.DirApp, "extracted"))
Para un ZIP cifrado abierto con contraseña:
Dim Zip As ZipFile
Zip.InitializeWithPassword( _
File.Combine(File.DirApp, "secure.zip"), _
"Secret123")
Zip.ExtractAll(File.Combine(File.DirApp, "output"))
If Zip.HasError Then
Log(Zip.LastError)
End If
También existe:
Zip.ExtractZipWithPassword( _
File.Combine(File.DirApp, "secure.zip"), _
File.Combine(File.DirApp, "output"), _
"Secret123")
Extraer una sola entrada
Zip.ExtractFile( _
"docs/manual.pdf", _
File.Combine(File.DirApp, "output"))
El nombre debe coincidir con la ruta interna de la entrada.
Leer un archivo sin extraerlo
Texto
Dim JsonText As String = Zip.ReadText( _
"config/settings.json", _
"UTF-8")
If Zip.HasError Then
Log(Zip.LastError)
Else
Log(JsonText)
End If
Si el Charset está vacío, ReadText usa UTF-8.
Bytes
Dim Data() As Byte = Zip.ReadBytes("images/logo.png")
Log(Data.Length)
ReadBytes carga la entrada completa en memoria. Para archivos grandes usa GetInputStream.
Leer mediante InputStream
Primero busca el header:
Dim Header As ZipFileHeader = Zip.getFileName("video/data.bin")
If Header <> Null Then
Dim In As InputStream = Zip.GetInputStream(Header)
' Procesar el stream...
In.Close
End If
getFileName(filename) permanece documentado como método porque recibe un parámetro; no es una propiedad B4X.
Listar el contenido del ZIP
La propiedad FileNames tiene un nombre histórico: no devuelve Strings. Devuelve una lista de ZipFileHeader.
For Each Header As ZipFileHeader In Zip.FileNames
Log(Header.FileName)
Next
Ejemplo completo:
For Each Header As ZipFileHeader In Zip.FileNames
Log("Name: " & Header.FileName)
Log("Directory: " & Header.IsDirectory)
Log("Encrypted: " & Header.IsEncrypted)
Log("Method: " & Header.CompressionMethod)
Log("Original: " & Header.UncompressedSize)
Log("Compressed: " & Header.CompressedSize)
Next
Si necesitas los objetos nativos de Zip4j:
Dim NativeHeaders As List = Zip.FileHeaders
ZipFileHeader envuelve un net.lingala.zip4j.model.FileHeader.
Normalmente no necesitas crearlo manualmente: lo obtienes desde Zip.FileNames o Zip.getFileName(...).
Propiedades de ZipFileHeader
| Propiedad | Acceso | Tipo | Descripción |
|---|---|---|---|
| Obj | lectura / escritura | Object | FileHeader nativo |
| FileName | lectura / escritura | String | Ruta interna de la entrada |
| LastModifiedTime | lectura | Long | Epoch milliseconds |
| UncompressedSize | lectura | Long | Tamaño original |
| CompressedSize | lectura | Long | Tamaño comprimido |
| Crc | lectura | Long | CRC-32 |
| IsDirectory | lectura | Boolean | Es directorio |
| CompressionMethod | lectura | String | DEFLATE, STORE, etc. |
| IsEncrypted | lectura | Boolean | Entrada cifrada |
| FileComment | lectura | String | Comentario de la entrada |
| OffsetLocalHeader | lectura | Long | Offset del header local |
FileName no renombra el ZIP
Esto:
Header.FileName = "new-name.txt"
solo modifica el objeto header en memoria.
Para renombrar realmente la entrada almacenada:
Zip.RenameFile("old-name.txt", "new-name.txt")
Renombrar entradas
Una entrada:
Zip.RenameFile( _
"docs/old.txt", _
"docs/new.txt")
Varias entradas:
Dim RenameMap As Map
RenameMap.Initialize
RenameMap.Put("a.txt", "archive/a.txt")
RenameMap.Put("b.txt", "archive/b.txt")
Zip.RenameFiles(RenameMap)
Eliminar entradas
Una:
Zip.RemoveFile("old.log")
Varias:
Dim RemoveList As List
RemoveList.Initialize2(Array As String( _
"temp/a.tmp", _
"temp/b.tmp"))
Zip.RemoveFiles(RemoveList)
Comentario del ZIP
Como getComment/setComment forman un accesor B4X válido, se usa como propiedad:
Zip.Comment = "Backup generated by my B4J app"
Log(Zip.Comment)
Charset
Configura el charset usado por Zip4j para nombres y comentarios:
Zip.SetCharset("UTF-8")
Log(Zip.GetCharset)
Otros nombres aceptados dependen de los charsets disponibles en Java, por ejemplo CP437 o Windows-1252.
SetCharset y GetCharset comienzan con mayúscula, por lo que se documentan como métodos normales, no como propiedad B4X.
Validar un ZIP
If Zip.ValidateArchive Then
Log("ZIP válido")
Else
Log("ZIP no válido: " & Zip.LastError)
End If
Alias público:
If Zip.IsValidZipFile Then
Log("ZIP válido")
End If
ZIP cifrado
If Zip.IsEncrypted Then
Log("El archivo requiere contraseña")
End If
ZIP dividido / multipart
Detectar:
If Zip.IsSplitArchive Then
Log("Es un ZIP dividido")
End If
Fusionar:
Zip.MergeSplitFiles( _
File.Combine(File.DirApp, "merged.zip"))
El wrapper actual permite detectar y fusionar split ZIP. No expone un método público específico para crear un ZIP dividido.
Aunque GetCapabilities devuelve SplitZip = True, en esta API pública esa capacidad se refiere al manejo de archivos divididos existente, especialmente detección y merge.
Ejecución en segundo plano
Zip.RunInThread = True
Dim Opt As Map = Zip.CreateOptions
Zip.AddFolder2(File.Combine(File.DirApp, "large-folder"), Opt)
Después puedes consultar el monitor periódicamente.
Ejemplo con Timer
Sub Class_Globals
Private Zip As ZipFile
Private ProgressTimer As Timer
End Sub
Private Sub StartBackup
Zip.Initialize(File.Combine(File.DirApp, "backup.zip"))
Zip.RunInThread = True
Zip.SmartCompression = False
ProgressTimer.Initialize("ProgressTimer", 200)
ProgressTimer.Enabled = True
Dim Opt As Map = Zip.CreateOptions
Zip.AddFolder2(File.Combine(File.DirApp, "data"), Opt)
End Sub
Private Sub ProgressTimer_Tick
Log("Task: " & Zip.ProgressTask)
Log("File: " & Zip.ProgressFile)
Log("Progress: " & Zip.ProgressPercent & "%")
If Zip.IsBusy = False Then
ProgressTimer.Enabled = False
Log("Result: " & Zip.ProgressResult)
If Zip.ProgressError <> "" Then
Log("Error: " & Zip.ProgressError)
End If
End If
End Sub
En modo asíncrono, un Boolean devuelto inmediatamente por una función significa que la llamada pudo iniciarse; el resultado final de la tarea debe consultarse mediante ProgressResult y ProgressError.
Pausar, continuar y cancelar
Zip.Pause
Log(Zip.IsPaused)
Zip.Resume
Zip.Cancel
Estas operaciones actúan sobre el ProgressMonitor nativo.
Estados de progreso
Propiedades disponibles:
Log(Zip.IsBusy)
Log(Zip.ProgressPercent)
Log(Zip.ProgressFile)
Log(Zip.ProgressTask)
Log(Zip.ProgressState)
Log(Zip.ProgressResult)
Log(Zip.ProgressTotalWork)
Log(Zip.ProgressCompletedWork)
Log(Zip.ProgressError)
La implementación espera valores como:
ProgressState:
READY
BUSY
ProgressResult:
SUCCESS
WORK_IN_PROGRESS
ERROR
CANCELLED
ProgressTask devuelve el nombre de la tarea nativa, por ejemplo ADD, EXTRACT o MERGE_ZIP_FILES según la operación.
Estadísticas del archivo
Log("Files: " & Zip.FileCount)
Log("Folders: " & Zip.DirectoryCount)
Log("Original bytes: " & Zip.TotalUncompressedSize)
Log("ZIP bytes: " & Zip.TotalCompressedSize)
Log("Ratio: " & Zip.CompressionRatio & "%")
Cómo interpretar CompressionRatio
La fórmula implementada es:
TotalCompressedSize * 100 / TotalUncompressedSize
Por tanto:
100%≈ sin reducción.50%= el ZIP ocupa aproximadamente la mitad.25%= el ZIP ocupa aproximadamente una cuarta parte.
Si quieres calcular el porcentaje ahorrado:
Dim SavedPercent As Double = 100 - Zip.CompressionRatio
Capacidades declaradas
Dim Caps As Map = Zip.GetCapabilities
For Each Key As String In Caps.Keys
Log(Key & ": " & Caps.Get(Key))
Next
El wrapper declara:
Streams
AsyncProgress
Pause
Cancel
AES
ZipStandard
SplitZip
RenameMultiple
RemoveMultiple
SymbolicLinks
Charset
Zip64
SmartCompression
Acceso nativo a Zip4j
Para funciones avanzadas no envueltas:
Dim NativeZip As JavaObject = Zip.Obj
También existe el alias de lectura Obj2.
Utiliza el acceso nativo solo cuando necesites una función no cubierta por la API B4J, porque ya dependes directamente de las firmas de Zip4j.
Cerrar el archivo
Zip.Close
Libera los handles abiertos por el objeto Zip4j.
Ejemplo completo: backup inteligente y cifrado
Sub CreateSecureBackup
Dim Zip As ZipFile
Dim OutputZip As String = File.Combine(File.DirApp, "backup-secure.zip")
Dim SourceFolder As String = File.Combine(File.DirApp, "data")
Zip.InitializeWithPassword(OutputZip, "Secret123")
Zip.SmartCompression = True
Dim Opt As Map = Zip.CreateOptions
Opt.Put("IncludeRootFolder", True)
Opt.Put("CompressionLevel", Zip.LEVEL_ULTRA)
Opt.Put("EncryptFiles", True)
Opt.Put("EncryptionMethod", "AES")
Opt.Put("AesKeyStrength", "KEY_STRENGTH_256")
If Zip.AddFolder2(SourceFolder, Opt) = False Then
Log("ZIP error: " & Zip.LastError)
Return
End If
Zip.Comment = "Encrypted application backup"
Log("Files: " & Zip.FileCount)
Log("Compressed: " & Zip.TotalCompressedSize)
Log("Original: " & Zip.TotalUncompressedSize)
Log("Size ratio: " & NumberFormat(Zip.CompressionRatio, 1, 2) & "%")
Zip.Close
End Sub
API pública de ZipFile
Inicialización y configuración
Initialize, InitializeWithPassword, SetPassword, SetCharset, GetCharset, Close, ClearError, ShouldStore, CreateOptions, CreateZipParameters.
Añadir contenido
addFile, AddFile2, addFiles, AddFiles2, AddFolder, AddFolderWithParameters, AddFolder2, AddFolderSmart, AddFileToFolder, AddFilesToFolder, AddFolderToFolder, AddStream, AddStream2.
Extracción y lectura
ExtractAll, ExtractFile, ExtractZipWithPassword, GetInputStream, ReadText, ReadBytes.
Cifrado
InitializeWithPassword, SetPassword, saveZipCPassword.
Modificar el ZIP
RemoveFile, RemoveFiles, RenameFile, RenameFiles.
Inspección
getFileName(filename), IsEncrypted, IsSplitArchive, ValidateArchive, IsValidZipFile, MergeSplitFiles, GetCapabilities.
Control asíncrono
Cancel, Pause, Resume.
Las demás funciones getX/setX compatibles aparecen en la documentación como propiedades B4X.
API pública de ZipFileHeader
Métodos normales:
Initialize, isDirectory.
Las funciones getX/setX compatibles se presentan como propiedades:
Obj, FileName, LastModifiedTime, UncompressedSize, CompressedSize, Crc, IsDirectory, CompressionMethod, IsEncrypted, FileComment, OffsetLocalHeader.
Buenas prácticas
- Usa
AddFile2,AddFolder2yAddStream2cuando necesites control y manejo de errores. - Comprueba
LastError/HasErrordespués de operaciones que no devuelven Boolean. - Para archivos grandes dentro del ZIP, usa
GetInputStreamen lugar deReadBytes. - Para cifrado nuevo, prefiere el flujo explícito con
InitializeWithPasswordy opciones AES. - Usa
ZipFileHeaderpara inspeccionar entradas; no cambiesHeader.FileNameesperando renombrar el archivo almacenado. - Para carpetas Smart, usa modo síncrono si quieres la selección STORE/DEFLATE por archivo.
- Cierra el objeto con
Closecuando hayas terminado.
Utilidades relacionadas del sistema de archivos
La familia Archivos y compresión también incluye:
- FileUtils — copia/eliminación recursiva de carpetas,
CopyAsync, renombrado, listado de subcarpetas y fechas de archivo. - FileChooserUtils — filtros de extensión para JavaFX
FileChooser, filtro combinado,All Filesy selección del filtro predeterminado.
Un flujo práctico de backup puede usar FileChooserUtils → FileUtils → ZipFile: elegir el destino, preparar los archivos, crear el ZIP, validarlo y finalmente eliminar los datos temporales.