Android Java实现文件压缩与解压缩的实战代码

2 下载量 2 浏览量 更新于2024-08-28 收藏 46KB PDF 举报
在Android开发中,实现文件的压缩和解压缩是一个常见的需求,特别是在处理大量数据或者需要减小存储空间的应用中。本文将详细介绍如何使用Java来完成这个任务,具体是通过`ZipUtils`类来操作文件的压缩和解压。以下是一段关键的Java代码示例: ```java import java.io.*; import java.util.*; import java.util.zip.*; public class ZipUtils { private static final int BUFFER_SIZE = 1024 * 1024; // 1MByte / * 批量压缩文件(夹) * * @param resFileList 需要压缩的文件(夹)列表 * @param zipFile 生成的压缩文件 * @throws IOException 当压缩过程出错时抛出 */ public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException { ZipOutputStream zipOut = null; try { zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), BUFFER_SIZE)); for (File file : resFileList) { if (file.isDirectory()) { compressDirectory(file, zipOut); } else { compressFile(file, zipOut); } } zipOut.finish(); // 结束压缩,确保所有数据写入 } catch (FileNotFoundException e) { throw new IOException("文件不存在", e); } finally { if (zipOut != null) { try { zipOut.close(); } catch (IOException e) { // 忽略关闭异常 } } } } // 压缩单个文件 private static void compressFile(File file, ZipOutputStream zipOut) throws IOException { FileInputStream fis = new FileInputStream(file); ZipEntry entry = new ZipEntry(file.getName()); zipOut.putNextEntry(entry); byte[] buffer = new byte[BUFFER_SIZE]; int length; while ((length = fis.read(buffer)) > 0) { zipOut.write(buffer, 0, length); } fis.close(); zipOut.closeEntry(); } // 压缩目录及其内容 private static void compressDirectory(File dir, ZipOutputStream zipOut) throws IOException, FileNotFoundException { Enumeration<?> entries = dir.list(); while (entries.hasMoreElements()) { String name = (String) entries.nextElement(); File entryFile = new File(dir, name); if (entryFile.isDirectory()) { compressDirectory(entryFile, zipOut); } else { compressFile(entryFile, zipOut); } } } } ``` 这段代码的核心功能是创建一个`ZipOutputStream`对象,用于将文件或目录中的内容添加到压缩文件中。`zipFiles`方法接受一个`File`类型的集合,其中包含需要压缩的文件和目录。对于每个元素,如果是文件,则调用`compressFile`方法;如果是目录,则递归地调用`compressDirectory`方法,以压缩目录下的所有子文件。 `compressFile`方法打开一个`FileInputStream`,读取文件内容并逐块写入`ZipOutputStream`,同时创建一个`ZipEntry`表示文件在压缩包中的位置。`compressDirectory`方法则对指定目录进行遍历,递归地调用自身来处理子目录。 需要注意的是,如果在压缩过程中发生异常,比如文件不存在或者I/O错误,会抛出`IOException`。最后,`finish()`方法用于确保压缩文件被完整地写入。 这段Java代码展示了如何在Android应用中使用Java的标准库来实现文件的压缩和解压缩功能,适用于处理本地文件系统上的资源管理。通过这个例子,开发者可以灵活地将多个文件或目录打包成一个压缩文件,以节省存储空间或者方便传输。