使用Java解压和压缩文件

目录

一、压缩文件

二、解压文件 


在Java中,你可以使用java.util.zip包来实现解压和压缩文件。这个包提供了对ZIP格式的文件进行压缩和解压的功能。

一、压缩文件

ZipOutputStream 是 Java 中用于创建 ZIP 文件的类。它是 java.util.zip 包中的一部分,允许你将多个文件或目录压缩到单个 ZIP 文件中。

  1. 创建 ZipOutputStream: 要创建 ZipOutputStream 对象,你需要将其与一个输出流(通常是 FileOutputStream)关联,以便将压缩数据写入文件。

    FileOutputStream fos = new FileOutputStream("compressed.zip"); 
    ZipOutputStream zipOut = new ZipOutputStream(fos);
  2. 添加 ZIP 条目: 使用 putNextEntry 方法来添加一个新的 ZIP 条目(文件或目录)。你需要指定条目的名称,它可以是文件名或相对路径。

    ZipEntry zipEntry = new ZipEntry("file.txt"); 
    zipOut.putNextEntry(zipEntry);
  3. 写入数据: 使用 write 方法来将数据写入 ZIP 条目。你可以循环从文件或其他数据源中读取数据,并将其写入 ZipOutputStream

    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) >= 0) {
        zipOut.write(buffer, 0, length);
    }
    
  4. 关闭 ZIP 条目: 当完成写入 ZIP 条目的数据后,必须使用 closeEntry 方法来关闭条目。

    zipOut.closeEntry();
  5. 关闭 ZipOutputStream: 当所有 ZIP 条目都已添加和关闭后,需要关闭 ZipOutputStream

    zipOut.close();
  6. ZIP 条目属性: ZipEntry 对象允许你设置各种属性,如文件的修改时间、权限等。

    ZipEntry zipEntry = new ZipEntry("file.txt");
    zipEntry.setTime(file.lastModified());
    zipEntry.setSize(file.length());
    zipEntry.setMethod(ZipEntry.STORED);
    
  7. 压缩方法: ZipOutputStream 支持不同的压缩方法,可以根据需要设置。默认情况下,使用标准的 DEFLATED 压缩方法。

  8. 异常处理: 要注意处理可能的异常,例如文件不存在、权限问题等。确保正确关闭流以释放资源。

 压缩文件示例如下:

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileCompression {
    public static void main(String[] args) {
        String sourceFile = "source.txt"; // 要压缩的文件
        String compressedFile = "compressed.zip"; // 压缩后的文件

        try {
            FileOutputStream fos = new FileOutputStream(compressedFile);
            ZipOutputStream zipOut = new ZipOutputStream(fos);
            File fileToZip = new File(sourceFile);

            FileInputStream fis = new FileInputStream(fileToZip);
            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }

            fis.close();
            zipOut.close();
            fos.close();
            System.out.println("文件压缩完成:" + compressedFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述示例中,我们使用ZipOutputStream将文件source.txt压缩为compressed.zip

二、解压文件 

ZipInputStream 是 Java 中用于解压缩 ZIP 文件的类。它是 java.util.zip 包中的一部分,允许你从 ZIP 文件中读取数据。

  1. 创建 ZipOutputStream: 要创建 ZipOutputStream 对象,你需要将其与一个输出流(通常是 FileOutputStream)关联,以便将压缩数据写入文件。

    FileOutputStream fos = new FileOutputStream("compressed.zip");
    ZipOutputStream zipOut = new ZipOutputStream(fos);
    
  2. 添加 ZIP 条目: 使用 putNextEntry 方法来添加一个新的 ZIP 条目(文件或目录)。你需要指定条目的名称,它可以是文件名或相对路径。

    ZipEntry zipEntry = new ZipEntry("file.txt");
    zipOut.putNextEntry(zipEntry);
    
  3. 写入数据: 使用 write 方法来将数据写入 ZIP 条目。你可以循环从文件或其他数据源中读取数据,并将其写入 ZipOutputStream

    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) >= 0) {
        zipOut.write(buffer, 0, length);
    }
    
  4. 关闭 ZIP 条目: 当完成写入 ZIP 条目的数据后,必须使用 closeEntry 方法来关闭条目。

    zipOut.closeEntry();
    
  5. 关闭 ZipOutputStream: 当所有 ZIP 条目都已添加和关闭后,需要关闭 ZipOutputStream

    zipOut.close();
    
  6. ZIP 条目属性: ZipEntry 对象允许你设置各种属性,如文件的修改时间、权限等。

    ZipEntry zipEntry = new ZipEntry("file.txt");
    zipEntry.setTime(file.lastModified());
    zipEntry.setSize(file.length());
    zipEntry.setMethod(ZipEntry.STORED);
    
  7. 压缩方法: ZipOutputStream 支持不同的压缩方法,可以根据需要设置。默认情况下,使用标准的 DEFLATED 压缩方法。

  8. 异常处理: 要注意处理可能的异常,例如文件不存在、权限问题等。确保正确关闭流以释放资源。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Java进行文件压缩和解压缩的示例代码: 1. 使用java.util.zip包进行压缩和解压缩: ```java import java.io.*; import java.util.zip.*; public class ZipUtil { public static void compressFile(String sourceFilePath, String destinationFilePath) throws IOException { FileOutputStream fos = new FileOutputStream(destinationFilePath); ZipOutputStream zipOut = new ZipOutputStream(fos); File fileToZip = new File(sourceFilePath); zipFile(fileToZip, fileToZip.getName(), zipOut); zipOut.close(); fos.close(); } private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException { if (fileToZip.isHidden()) { return; } if (fileToZip.isDirectory()) { if (fileName.endsWith("/")) { zipOut.putNextEntry(new ZipEntry(fileName)); zipOut.closeEntry(); } else { zipOut.putNextEntry(new ZipEntry(fileName + "/")); zipOut.closeEntry(); } File[] children = fileToZip.listFiles(); for (File childFile : children) { zipFile(childFile, fileName + "/" + childFile.getName(), zipOut); } return; } FileInputStream fis = new FileInputStream(fileToZip); ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); } fis.close(); } public static void decompressFile(String zipFilePath, String destinationFolderPath) throws IOException { File destDir = new File(destinationFolderPath); if (!destDir.exists()) { destDir.mkdir(); } ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { String filePath = destinationFolderPath + File.separator + entry.getName(); if (!entry.isDirectory()) { extractFile(zipIn, filePath); } else { File dir = new File(filePath); dir.mkdir(); } zipIn.closeEntry(); entry = zipIn.getNextEntry(); } zipIn.close(); } private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); byte[] bytesIn = new byte[1024]; int read; while ((read = zipIn.read(bytesIn)) != -1) { bos.write(bytesIn, 0, read); } bos.close(); } } ``` 2. 使用Apache Commons Compress库进行压缩和解压缩: ```java import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.archivers.ArchiveOutputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import org.apache.commons.compress.utils.IOUtils; import java.io.*; public class ZipUtil { public static void compressFile(String sourceFilePath, String destinationFilePath) throws IOException { FileOutputStream fos = new FileOutputStream(destinationFilePath); ArchiveOutputStream zipOut = new ZipArchiveOutputStream(fos); File fileToZip = new File(sourceFilePath); zipFile(fileToZip, fileToZip.getName(), zipOut); zipOut.close(); fos.close(); } private static void zipFile(File fileToZip, String fileName, ArchiveOutputStream zipOut) throws IOException { if (fileToZip.isHidden()) { return; } if (fileToZip.isDirectory()) { if (fileName.endsWith("/")) { zipOut.putArchiveEntry(new ZipArchiveEntry(fileName)); zipOut.closeArchiveEntry(); } else { zipOut.putArchiveEntry(new ZipArchiveEntry(fileName + "/")); zipOut.closeArchiveEntry(); } File[] children = fileToZip.listFiles(); for (File childFile : children) { zipFile(childFile, fileName + "/" + childFile.getName(), zipOut); } return; } FileInputStream fis = new FileInputStream(fileToZip); ArchiveEntry zipEntry = new ZipArchiveEntry(fileName); zipOut.putArchiveEntry(zipEntry); IOUtils.copy(fis, zipOut); fis.close(); zipOut.closeArchiveEntry(); } public static void decompressFile(String zipFilePath, String destinationFolderPath) throws IOException { File destDir = new File(destinationFolderPath); if (!destDir.exists()) { destDir.mkdir(); } FileInputStream fis = new FileInputStream(zipFilePath); ArchiveInputStream zipIn = new ZipArchiveInputStream(fis); ArchiveEntry entry = zipIn.getNextEntry(); while (entry != null) { String filePath = destinationFolderPath + File.separator + entry.getName(); if (!entry.isDirectory()) { extractFile(zipIn, filePath); } else { File dir = new File(filePath); dir.mkdir(); } zipIn.closeEntry(); entry = zipIn.getNextEntry(); } zipIn.close(); fis.close(); } private static void extractFile(ArchiveInputStream zipIn, String filePath) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); IOUtils.copy(zipIn, bos); bos.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值