使用org.apache.tools.zip包操作文件

2023-11-11

import java.io.*;
import org.apache.tools.zip.*;
import java.util.Enumeration;
/**
*功能:zip压缩、解压(支持中文文件名)
*说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
* 解决了由于java.util.zip包不支持汉字的问题。
* 使用java.util.zip包时,当zip文件中有名字为中文的文件时,
* 就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException
* at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
*注意:
* 1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
* 2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
* 3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]
* 4、本程序使用Ant 1.7.1 中的ant.jar
*
*仅供编程学习参考.
*
*@author Winty
*@date 2008-8-3
*@Usage:
* 压缩:java AntZip -zip "directoryName"
* 解压:java AntZip -unzip "fileName.zip"
*/

public class AntZip{
private ZipFile zipFile;
private ZipOutputStream zipOut; //压缩Zip
private ZipEntry zipEntry;
private static int bufSize; //size of bytes
private byte[] buf;
private int readedBytes;

public AntZip(){
this(512);
}

public AntZip(int bufSize){
this.bufSize = bufSize;
this.buf = new byte[this.bufSize];
}

//压缩文件夹内的文件
public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名
File file;
File zipDir;

zipDir = new File(zipDirectory);
String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名

try{
this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
handleDir(zipDir , this.zipOut);
this.zipOut.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}

//由doZip调用,递归完成目录文件读取
private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
FileInputStream fileIn;
File[] files;

files = dir.listFiles();

if(files.length == 0){//如果目录为空,则单独创建之.
//ZipEntry的isDirectory()方法中,目录以"/"结尾.
this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));
this.zipOut.closeEntry();
}
else{//如果目录不为空,则分别处理目录和文件.
for(File fileName : files){
//System.out.println(fileName);

if(fileName.isDirectory()){
handleDir(fileName , this.zipOut);
}
else{
fileIn = new FileInputStream(fileName);
this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));

while((this.readedBytes = fileIn.read(this.buf))>0){
this.zipOut.write(this.buf , 0 , this.readedBytes);
}

this.zipOut.closeEntry();
}
}
}
}

//解压指定zip文件
public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名
FileOutputStream fileOut;
File file;
InputStream inputStream;

try{
this.zipFile = new ZipFile(unZipfileName);

for(Enumeration entries = this.zipFile.getEntries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
file = new File(entry.getName());

if(entry.isDirectory()){
file.mkdirs();
}
else{
//如果指定文件的目录不存在,则创建之.
File parent = file.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}

inputStream = zipFile.getInputStream(entry);

fileOut = new FileOutputStream(file);
while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
fileOut.write(this.buf , 0 , this.readedBytes );
}
fileOut.close();

inputStream.close();
}
}
this.zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}

//设置缓冲区大小
public void setBufSize(int bufSize){
this.bufSize = bufSize;
}

//测试AntZip类
public static void main(String[] args)throws Exception{
if(args.length==2){
String name = args[1];
AntZip zip = new AntZip();

if(args[0].equals("-zip"))
zip.doZip(name);
else if(args[0].equals("-unzip"))
zip.unZip(name);
}
else{
System.out.println("Usage:");
System.out.println("压缩:java AntZip -zip directoryName");
System.out.println("解压:java AntZip -unzip fileName.zip");
throw new Exception("Arguments error!");
}
}
}

本文出自 “天堂露珠” 博客,请务必保留此出处http://wintys.blog.51cto.com/425414/90878
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用org.apache.tools.zip包操作文件 的相关文章

  • 将 GAE/J 上的 pdfjet 生成的 PDF 文件上传到 Google Docs

    我需要将 PDF 文件上传到用户谷歌文档 该文件是由谷歌应用引擎上的 pdfjet 生成的 我想出使用 pdfjet for gae j 生成 pdf pdfjet 使用流来创建 pdf 无论如何 是否可以将流转换为文件 以便我可以上传给用
  • 如何在java中以编程方式访问网页

    有一个网页 我想从中检索某个字符串 为此 我需要登录 单击一些按钮 填充文本框 单击另一个按钮 然后就会出现字符串 我怎样才能编写一个java程序来自动执行此操作 是否有任何有用的库用于此目的 Thanks Try HtmlUnit htt
  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • spring-data-neo4j 基本一对多关系不持久

    EDIT 示例项目可在github https github com troig neo4jCustomRepository 我在后端项目中使用 Neo4J Rest 图形数据库 托管在 grapheneDb 中 和 Spring Data
  • 如何在线程和小程序中使用双缓冲

    我有一个关于何时调用绘制和更新方法的问题 我有游戏小程序 我想在其中使用双缓冲 但我无法使用它 问题是 在我的游戏中 有一个球在 run 方法内移动 我想知道如何使用双缓冲来交换屏幕外图像和当前图像 请有人帮忙 当同时存在 update 和
  • 多个罐子、单个持久单元解决方案?

    包括我在内的一些人一直在努力将不同模块 jar 中的实体合并到单个持久性单元中 尤其是JavaSE 例如这里JPA 2 0 自动从不同的 jar 添加实体类到 PersistenceUnit https stackoverflow com
  • [重复]

    这个问题在这里已经有答案了 有什么区别List
  • HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向

    我不明白为什么JavaHttpURLConnection不遵循从 HTTP 到 HTTPS URL 的 HTTP 重定向 我使用以下代码来获取页面https httpstat us https httpstat us import java
  • 动态更新 LookAndFeel 值

    我希望能够动态更新 Swing GUI 的 LookAndFeel 属性 在本例中 我有一个简单的 Swing Awt 游戏 运行最初为 Nimbus 的游戏LookAndFeel 在启动后的各个时刻 我只想更改 比方说 一个细节 应用程序
  • 在 Spring Boot 异常处理期间保留自定义 MDC 属性

    简短版本 有足够的细节 如何保留添加在MDC中的属性doFilter 的方法javax servlet Filter执行 public void doFilter ServletRequest request ServletResponse
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • 版本差异? Java 中的正则表达式转义

    看来正则表达式转义在不同版本的 Java 中的工作方式不同 在 Java openjdk 16 0 1 中编译工作正常 在 Java openjdk 11 0 11 中抛出此编译错误 test java 15 error illegal e
  • Jersey/JAX-RS:如何自动使用@Valid递归级联bean验证?

    我正在 Jersey 的 REST 资源端点中验证我的 POJO public class Resource POST public Response post NotNull Valid final POJO pojo public cl
  • 是否可以将自定义清单添加到 Netbeans 6.7.1 中编译的 Java 库中?

    我尝试添加manifest file src dir manifest mf到project properties 但是查看build impl xml我发现manifest available通常伴随着main class条件 所以这让我
  • 计算事件之间的天数 - Android

    我一直在研究 Android API 并一直在寻找一种方法来计算当前日期和未来日期之间的天数 我对 android 还很陌生 而且我已经有几年没有做过 java 了 计算这个最简单的方法是什么 Thanks 最简单的方法是使用乔达时间 ht
  • 部署到 Glassfish 4.1 时 URL 模式无效

    如果用户已经通过身份验证 我有一个网络过滤器可以从登录和索引页面重定向 最初我有一个无效的 URL 模式 我修复了无效模式并尝试重新部署以接收以下内容 java lang IllegalArgumentException Invalid U
  • 根据另一个列表的顺序对列表进行排序[重复]

    这个问题在这里已经有答案了 我需要对列表进行排序Person对象 List
  • 异步方法的同步版本

    在 Java 中创建异步方法的同步版本的最佳方法是什么 假设您有一个包含这两种方法的类 asyncDoSomething Starts an asynchronous task onFinishDoSomething Called when
  • 运行外部进程的非阻塞线程

    我创建了一个 Java GUI 应用程序 它充当许多低级外部进程的包装器 该实用程序按原样运行 但迫切需要一项重大改进 我希望我的外部进程以非阻塞方式运行 这将允许我并行服务其他请求 简而言之 我希望能够在生成数据时处理来自外部进程的数据
  • Java 和 SQL Server 中的精度噩梦

    我一直在与 Java 和 SQL Server 中的精确噩梦作斗争 直到我不再知道了 就我个人而言 我理解这个问题及其根本原因 但向地球另一端的客户解释这一点是不可行的 至少对我来说 情况是这样的 我在 SQL Server 中有两列 Qt

随机推荐

  • 混合开发监听安卓手机物理返回键

    混合开发监听安卓手机物理返回键 在用h5做混合开发过程中由于有个考试考试页面 中途不能退出 退出要添加确认操作 所以需要监听手机的返回操作 不让用户直接通过返回键返回 目前了解到混合开发中有两种方式监听 方式一 监听popstate 用到的
  • 指针式仪表识别读数 Python(已开源数据集)

    目录 一 前言 二 使用方法 1 安装相关的库 2 运行 三 方法说明 MeterDetection类说明 类参数 主函数 self ImgCutCircle 截取表盘区域 滤除背景 self ContoursFilter 对轮廓进行筛选
  • linux下的shell 快捷键

    linux下的shell 快捷键 2011 05 24 14 06 51 转载 标签 杂谈 分类 linux Ctrl p重复上一次命令 Ctrl a跳到第一个字符前 Ctrl x同上但再按一次会从新回到原位置 Ctrl b前移一个字符不删
  • 深度探索C++对象模型(20)——函数语义学(4)——多继承第二基类对虚函数支持的影响、虚继承下的虚函数

    1 多继承第二基类对虚函数支持的影响 子类继承了几个父类 子类就有几个虚函数表 this指针调整的目的就是让对象指针正确的指向对象首地址 从而能正确的调用对象的成员函数或者说正确确定数据成员的存储位置 多重继承下 有几种情况 第二个或者后续
  • ubuntu设置共享文件夹与linux进行文件共享

    1 打开虚拟机设置 选项 共享文件夹 添加一个文件夹路径 这个路径是windows下 的路径 比如说E盘 可以在E盘里面新建一个 share文件夹 然后确定 2 在Linux目录下 cd mnt hgfs E share 就可以看到里面的文
  • NoSQL的概念

    NoSQL概述 发展历程 1 单机MySQL的年代 网站发展之初 网站的访问量基本不会太大 单个数据库完全足够 那个时候基本都是静态网页HTML服务器没有压力 数据量如果太大 一个机器放不下了 B Tree 索引也放不下了 访问量太大 一个
  • yum安装软件时报错libmysqlclient.so.18()(64bit)

    环境 CentOS 7 4 使用阿里yum的网络源 问题 使用yum安装软件时报错 2 postfix 2 10 1 6 el7 x86 64 has missing requires of libmysqlclient so 18 64b
  • PyQt5中为QTextEdit的某些字符单独设置大小和颜色

    QTextEdit支持富文本 因此您可以将css样式与html一起用于QTextEdit中的文本 可以使用不同的样式附加不同的富文本 为方便起见 只需创建一些格式化文本 并将相应的文本传递给python string的format方法来创建
  • [Linux安装软件详解系列]01 安装MySQL8.0

    目录 1 检查有没有安装MySQL 2 安装MySQL8 0 1 下载 rpm文件 2 上传rpm文件到服务器 3 安装rpm文件 4 查看安装好的包 5 安装MySQL 5 启动MySQL 3 本地登录 1 查看默认密码 2 本地登录My
  • 这注定是一场独一无二的旅行——周年纪念日 [form 2022 to 2023]

    啊哈 竟然已经一周年了 还记得自己写了两三篇博客以后 就停写了很久 很久 总是因为各种各样的事情拖沓 直到有一天CSDN轻轻敲醒了我沉睡的心灵 忽然意识到自己好久没写了 也让我去想自己的初衷 为何而写 Why 一直觉得内容创作是一个很酷的事
  • 华为OD机试 Python 查找人名

    描述 有一串由逗号分隔的人名 每个人名可能由一个或多个单词组成 请你设计一个方法 根据指定的前缀串 找出与前缀匹配的人名 前缀串的构造是由人名中每个单词的第一个字母组合而成 输入 一串用逗号分隔的人名 一个前缀串 输出 匹配前缀串的所有人名
  • 吴恩达机器学习之路---logistic regression

    logistic regression 一 Logistic 回归 利用matlib实现 基础版 1 logistic regression数学基础 1 1 此示例为二元分类 二元分类的最终预测结果h为 0 1 为获得此效果 使用sigmo
  • 02-----带宽分析-----码流、分辨率、帧率的概念及如何计算视频带宽

    相关文章 01 带宽分析 下载nmon分析软件 一 码流 分辨率 帧率的概念 1 码流 码流 Data Rate 是指视频文件在单位时间内使用的数据流量 也叫码率或码流率 是视频编码中画面质量控制中最重要的部分 一般我们用的单位是Kb s或
  • Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法

    栗子来源 https blog csdn net wenzhi20102321 article details 52524545 首先对java中同步锁与互斥锁进行区分 主要来源于知乎中的大佬总结如下 1 锁的概念 锁的目的就是避免多个线程
  • FTP服务器的文件模式属于,FTP服务器的文件模式属于

    FTP服务器的文件模式属于 内容精选 换一换 在SAP HANA系统中 Shared卷和Backup卷由SFS Turbo提供时 需要创建一个SFS Turbo 提供共享路径给SAP HANA节点 表1列出了弹性文件服务的常用功能 在使用弹
  • uc浏览器解析视频源码,不废话,直接源码

    package cn rs blog service jiexi import com jfinal kit HttpKit import org apache http client CookieStore import org apac
  • 计算时间复杂度--(简单版)

    步骤 1 找到执行次数最多的语句 2 语句执行语句的数量级 3 用O表示结果 计算时间复杂度的3个出发点 掌握这三个出发点 那么一向搞不懂的时间复杂度就可以迎刃而解啦 然后 1 用常数1取代运行时间中的所有加法常数 2 在修改后的运行次数函
  • Spark(火花)快速、通用的大数据处理引擎框架

    一 什么是Spark 火花 是一种快速 通用处理大数据分析的框架引擎 二 Spark的四大特性 1 快速 Spark内存上采用DAG 有向无环图 执行引擎非循环数据流和内存计算支持 内存上比MapReduce快速100倍 磁盘上快10倍左右
  • android surfaceflinger 老罗,「Android」SurfaceFlinger分析

    本篇针对surfaceFlinger模块进行分析 目录如下 1 SurfaceFlinger功能 1 1 BufferQueue原理 native libs gui模块 1 2 layer显示内存分配 native libs ui模块 1
  • 使用org.apache.tools.zip包操作文件

    import java io import org apache tools zip import java util Enumeration 功能 zip压缩 解压 支持中文文件名 说明 本程序通过使用Apache Ant里提供的zip工