利用java实现zip的压缩和解压
Java解压ZIP文件的简单操作
}
entries.add(entry);
}
unzip(zipFile, entries, outputDirectory);
}
public static void unzip(ZipFile zipFile, List<ZipEntry> entries,
MultiThreadEntry mte = new MultiThreadEntry(zipFile, zipEntry,
outputDirectory);
Thread thread = new Thread(mte);
thread.start();
}
}
e1.printStackTrace();
}
} finally {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void unzipFiles(ZipEntry zipEntry, String outputDirectory)
/*
* Use MultiThread to read each entry
*/
private static class MultiThreadEntry implements Runnable {
public static final int BUFFER_SIZE = 2048;
*/
public ZipUtils() {
}
public static void unZipDirectory(String zipFileDirectory,
java分卷压缩方法
java分卷压缩方法在Java中,我们可以使用Java的内置库来处理文件分卷压缩。
一个常用的库是Java 的 `java.util.zip`。
下面是一个示例代码,演示如何使用这个库来分卷压缩文件:```javaimport java.io.*;import java.util.zip.*;public class VolumeZipFile {public static void main(String[] args) throws IOException {File inputFile = new File("sourceFile"); // 输入文件FileOutputStream fos = new FileOutputStream("zipFile"); // 输出文件ZipOutputStream zos = new ZipOutputStream(fos);ZipEntry ze = new ZipEntry(inputFile.getName());zos.putNextEntry(ze);FileInputStream in = new FileInputStream(inputFile);byte[] buffer = new byte[1024];int len;while ((len = in.read(buffer)) > 0) {zos.write(buffer, 0, len);}in.close();zos.closeEntry();zos.close();}}```这段代码将一个文件压缩成一个zip文件。
如果你想要分卷压缩,你需要自己定义每个卷的大小,并在写入数据时控制卷的大小。
以下是一个示例,该示例将文件分卷压缩为每个10MB的卷:```javaimport java.io.*;import java.util.zip.*;public class VolumeZipFile {public static void main(String[] args) throws IOException {File inputFile = new File("sourceFile"); // 输入文件FileOutputStream fos = new FileOutputStream("zipFile"); // 输出文件ZipOutputStream zos = new ZipOutputStream(fos);byte[] buffer = new byte[1048576]; // 10MB in bytesint len;int currentVolume = 1;long totalBytesRead = 0;while ((len = inputFile.read(buffer)) > 0) {zos.write(buffer, 0, len);totalBytesRead += len;if (totalBytesRead >= 10485760) { // 10MB * 10 = 100MBzos.finish();zos = new ZipOutputStream(new FileOutputStream("outputFile" + currentVolume + ".zip")); // create a new volume filecurrentVolume++;totalBytesRead = 0; // reset the counter for the next volume}}zos.finish(); // close the last volume file if necessary}}```注意,这个示例代码并没有处理异常,你可能需要在实际使用中添加适当的异常处理代码。
ZIP4j压缩与解压的实例详解
ZIP4j压缩与解压的实例详解ZIP4j 压缩与解压的实例详解使⽤的jar包:zip4j_1.3.2.jar基本功能:针对ZIP压缩⽂件创建、添加、分卷、更新和移除⽂件(读写有密码保护的Zip⽂件)(⽀持AES 128/256算法加密)(⽀持标准Zip算法加密)(⽀持zip64格式)(⽀持Store(仅打包,默认不压缩,不过可以⼿动设置⼤⼩)和Deflate压缩⽅法(针对分块zip⽂件创建和抽出⽂件)(⽀持编码)(进度监控)压缩⽅式(3种):static final int COMP_STORE = 0;(仅打包,不压缩)(对应好压的存储)static final int COMP_DEFLATE = 8;(默认)(对应好压的标准)static final int COMP_AES_ENC = 99;压缩级别有5种:(默认0不压缩)级别跟好压软件是对应的;static final int DEFLATE_LEVEL_FASTEST = 1;static final int DEFLATE_LEVEL_FAST = 3;static final int DEFLATE_LEVEL_NORMAL = 5;static final int DEFLATE_LEVEL_MAXIMUM = 7;static final int DEFLATE_LEVEL_ULTRA = 9;加密⽅式:static final int ENC_NO_ENCRYPTION = -1;(默认,没有加密⽅法,如果采⽤此字段,会报错”没有提供加密算法”)static final int ENC_METHOD_STANDARD = 0;static final int ENC_METHOD_AES = 99;AES Key Strength:(默认-1,也就是ENC_NO_ENCRYPTION)static final int AES_STRENGTH_128 = 0x01;static final int AES_STRENGTH_192 = 0x02;static final int AES_STRENGTH_256 = 0x03;从构造⽅法可以默认情况:compressionMethod = P_DEFLATE;encryptFiles = false;//不设密码readHiddenFiles = true;//可见encryptionMethod = Zip4jConstants.ENC_NO_ENCRYPTION;//加密⽅式不加密aesKeyStrength = -1;//includeRootFolder = true;//timeZone = TimeZone.getDefault();//发现的现象:在采取默认压缩时:1.如果此压缩⽂件已经存在,那么压缩后,相同的⽂件会替换(有密码,密码被替换),原来不同的⽂件会继续保留,⽽且⽂件的时间还是第⼀次压缩的时间;如果想完全覆盖,那么需要判断此压缩⽂件存不存在,存在就删除;2.假如a⽂件加密⽣成了a.zip,此时如果再把其他的⽂件b也加密,然后⽣成同样的a.zip,那么a.zip⾥⾯的⽂件a,b将会有各⾃的密码。
JavaZIP压缩和解压缩文件(解决中文文件名乱码问题)
JavaZIP压缩和解压缩⽂件(解决中⽂⽂件名乱码问题)JDK中⾃带的ZipOutputStream在压缩⽂件时,如果⽂件名中有中⽂,则压缩后的zip⽂件打开时发现中⽂⽂件名变成乱码.解决的⽅法是使⽤apache-ant-zip.jar包(见附件)中的ZipOutputStream和ZipEntry.即,导⼊类:import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;并且注意,压缩之前调⽤ZipOutputStream的out.setEncoding(System.getProperty("sun.jnu.encoding"));⽅法,系统参数sun.jnu.encoding表⽰获取当前系统中的⽂件名的编码⽅式.这⾥将ZipOutputStream的⽂件名编码⽅式设置成系统的⽂件名编码⽅式.解压时,直接使⽤JDK原来的ZipInputStream即可.但是有个需要注意的地⽅是,在读取ZIP⽂件之前,需要设置:System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));将系统的ZIP编码格式设置为系统⽂件名编码⽅式,否则解压时报异常.import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;改为import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;ant包⾥提供ZipOutputStream类的setEncoding("gbk")⽅法。
zos.setEncoding("gbk");。
java解压缩zip文件(解决了中文文件出错)
{
System.out.println("Dir: " + entry.getName() + " skipped..");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给定根目录,返回一个相对路径所对应的实际文件名.
*
* @param zippath
private static String getUTF8String(byte[] b, int off, int len) {
try {
String s = new String(b,off,len,"gbk");
return s;
} catch (UnsupportedEncodingException e) {
String zipDir = "d:\\abc.zip";// 要解压的压缩文件的存放路径
File file = new File(zipDir);
String realname = file.getName();
原来的java.util.zip.ZipEntry里面,要加载本地库,在这里这些代码是没有用处的,去掉就可以了,而如果不去掉,会引起链接错误,很奇怪,这几个native方法我也没有找到在哪儿使用了,sun的jdk1.4.2里留着它们做什么呢?
static {
/* load the zip library */
System.out.println(realname);
JavaWeb实现多个文件压缩下载功能
JavaWeb实现多个⽂件压缩下载功能⽂件下载时,我们可能需要⼀次下载多个⽂件。
批量下载⽂件时,需要将多个⽂件打包为zip,然后再下载。
实现思路有两种:⼀是将所有⽂件先打包压缩为⼀个⽂件,然后下载这个压缩包,⼆是⼀边压缩⼀边下载,将多个⽂件逐⼀写⼊到压缩⽂件中。
我这⾥实现了边压缩边下载。
下载样式:点击下载按钮,会弹出下载框:下载后就有⼀个包含刚刚选中的两个⽂件:代码实现:FileBeanpublic class FileBean implements Serializable {private Integer fileId;// 主键private String filePath;// ⽂件保存路径private String fileName;// ⽂件保存名称public FileBean() {}public Integer getFileId() {return fileId;}public void setFileId(Integer fileId) {this.fileId = fileId;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}}控制层:@RequestMapping(value = "/download", method = RequestMethod.GET)public String download(String id, HttpServletRequest request,HttpServletResponse response) throws IOException {String str = "";if (id != null && id.length() != 0) {int index = id.indexOf("=");str = id.substring(index + 1);String[] ids = str.split(",");ArrayList<FileBean> fileList = new ArrayList<FileBean>();for (int i = 0; i < ids.length; i++) {// 根据id查找genericFileUpload,得到⽂件路径以及⽂件名 GenericFileUpload genericFileUpload = new GenericFileUpload();genericFileUpload = genericFileUploadService.find(Long.parseLong(ids[i]));FileBean file = new FileBean();file.setFileName(genericFileUpload.getFileName());file.setFilePath(genericFileUpload.getFilePath());fileList.add(file);}//设置压缩包的名字//解决不同浏览器压缩包名字含有中⽂时乱码的问题String zipName = "download.zip";response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename="+ zipName);//设置压缩流:直接写⼊response,实现边压缩边下载ZipOutputStream zipos =null;try{zipos=new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); zipos.setMethod(ZipOutputStream.DEFLATED);//设置压缩⽅法}catch(Exception e){e.printStackTrace();}DataOutputStream os=null;//循环将⽂件写⼊压缩流for(int i=0;i<fileList.size();i++){String filePath=fileList.get(i).getFilePath();String fileName=fileList.get(i).getFileName();File file=new File(filePath+"/"+fileName);//要下载⽂件的路径try{//添加ZipEntry,并ZipEntry中写⼊⽂件流//这⾥,加上i是防⽌要下载的⽂件有重名的导致下载失败zipos.putNextEntry(new ZipEntry(i+fileName));os=new DataOutputStream(zipos);InputStream is=new FileInputStream(file);byte[] b = new byte[100];int length = 0;while((length = is.read(b))!= -1){os.write(b, 0, length);}is.close();zipos.closeEntry();}catch(Exception e){e.printStackTrace();}}//关闭流try {os.flush();os.close();zipos.close();} catch (IOException e) {e.printStackTrace();}}return "redirect:list.jhtml";}总结以上所述是⼩编给⼤家介绍的JavaWeb 实现多个⽂件压缩下载功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
Java生成压缩文件(zip、rar格式)
Java⽣成压缩⽂件(zip、rar格式)jar坐标:<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version></dependency>话不多说,直接上代码package com.demo.student.util;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;import java.io.*;/*** ⽣成压缩⽂件(zip,rar 格式)*/public class CompressUtil {/*** @param path 要压缩的⽂件路径* @param format ⽣成的格式(zip、rar)d*/public static void generateFile(String path, String format) throws Exception {File file = new File(path);// 压缩⽂件的路径不存在if (!file.exists()) {throw new Exception("路径 " + path + " 不存在⽂件,⽆法进⾏压缩...");}// ⽤于存放压缩⽂件的⽂件夹String generateFile = file.getParent() + File.separator +"CompressFile";File compress = new File(generateFile);// 如果⽂件夹不存在,进⾏创建if( !compress.exists() ){compress.mkdirs();}// ⽬的压缩⽂件String generateFileName = compress.getAbsolutePath() + File.separator + "AAA" + file.getName() + "." + format;// 输⼊流表⽰从⼀个源读取数据// 输出流表⽰向⼀个⽬标写⼊数据// 输出流FileOutputStream outputStream = new FileOutputStream(generateFileName);// 压缩输出流ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(outputStream));generateFile(zipOutputStream,file,"");System.out.println("源⽂件位置:" + file.getAbsolutePath() + ",⽬的压缩⽂件⽣成位置:" + generateFileName);// 关闭输出流zipOutputStream.close();}/*** @param out 输出流* @param file ⽬标⽂件* @param dir ⽂件夹* @throws Exception*/private static void generateFile(ZipOutputStream out, File file, String dir) throws Exception {// 当前的是⽂件夹,则进⾏⼀步处理if (file.isDirectory()) {//得到⽂件列表信息File[] files = file.listFiles();//将⽂件夹添加到下⼀级打包⽬录out.putNextEntry(new ZipEntry(dir + "/"));dir = dir.length() == 0 ? "" : dir + "/";//循环将⽂件夹中的⽂件打包for (int i = 0; i < files.length; i++) {generateFile(out, files[i], dir + files[i].getName());}} else { // 当前是⽂件// 输⼊流FileInputStream inputStream = new FileInputStream(file);// 标记要打包的条⽬out.putNextEntry(new ZipEntry(dir));// 进⾏写操作int len = 0;byte[] bytes = new byte[1024];while ((len = inputStream.read(bytes)) > 0) {out.write(bytes, 0, len);}// 关闭输⼊流inputStream.close();}} // 测试public static void main(String[] args) {String path = "";String format = "rar";try {generateFile(path, format);} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}}}结果图:压缩整个⽂件/*** 递归压缩⽂件* @param output ZipOutputStream 对象流* @param file 压缩的⽬标⽂件流* @param childPath 条⽬⽬录*/private static void zip(ZipOutputStream output,File file,String childPath){ FileInputStream input = null;try {// ⽂件为⽬录if (file.isDirectory()) {// 得到当前⽬录⾥⾯的⽂件列表File list[] = file.listFiles();childPath = childPath + (childPath.length() == 0 ? "" : "/")+ file.getName();// 循环递归压缩每个⽂件for (File f : list) {zip(output, f, childPath);}} else {// 压缩⽂件childPath = (childPath.length() == 0 ? "" : childPath + "/")+ file.getName();output.putNextEntry(new ZipEntry(childPath));input = new FileInputStream(file);int readLen = 0;byte[] buffer = new byte[1024 * 8];while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1) {output.write(buffer, 0, readLen);}}} catch (Exception ex) {ex.printStackTrace();} finally {// 关闭流if (input != null) {try {input.close();} catch (IOException ex) {ex.printStackTrace();}}}}/*** 压缩⽂件(⽂件夹)* @param path ⽬标⽂件流* @param format zip 格式 | rar 格式* @throws Exception*/public static String zipFile(File path,String format) throws Exception {String generatePath = "";if( path.isDirectory() ){generatePath = path.getParent().endsWith("/") == false ? path.getParent() + File.separator + path.getName() + "." + format: path.getParent() + path.getName() + "." + format; }else {generatePath = path.getParent().endsWith("/") == false ? path.getParent() + File.separator : path.getParent();generatePath += path.getName().substring(0,path.getName().lastIndexOf(".")) + "." + format;}// 输出流FileOutputStream outputStream = new FileOutputStream( generatePath );// 压缩输出流ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));zip(out, path,"");out.flush();out.close();return generatePath;}使⽤// 使⽤例⼦public static void main(String[] args) {String path = "F:/test";String format = "zip";try {System.out.println(zipFile(new File(path),format));} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}}解压/**** @param sourceZip 待解压⽂件路径* @param destDir 解压到的路径*/public static String unZip(String sourceZip, String destDir) {//保证⽂件夹路径最后是"/"或者"\"if( !destDir.endsWith("/") ){destDir += File.separator;}String newDir = "";File sourceFile = new File(sourceZip);newDir = sourceFile.getName().substring(0,sourceFile.getName().lastIndexOf("."));File destDirFile = new File(destDir + newDir);Project p = new Project();Expand e = new Expand();e.setProject(p);e.setSrc(sourceFile);e.setOverwrite(true);e.setDest(destDirFile);/*ant下的zip⼯具默认压缩编码为UTF-8编码,⽽winRAR软件压缩是⽤的windows默认的GBK或者GB2312编码所以解压缩时要制定编码格式*/e.setEncoding("gbk");e.execute();return destDirFile.getAbsolutePath();}。
Java解压和压缩带密码的zip文件过程详解
Java解压和压缩带密码的zip⽂件过程详解前⾔JDK⾃带的ZIP操作接⼝(java.util.zip包,请参看⽂章末尾的博客链接)并不⽀持密码,甚⾄也不⽀持中⽂⽂件名。
为了解决ZIP压缩⽂件的密码问题,在⽹上搜索良久,终于找到了winzipaes开源项⽬。
该项⽬在下托管,仅⽀持AES压缩和解压zip⽂件( This library only supports Win-Zip's 256-Bit AES mode.)。
⽹站上下载的⽂件是源代码,最新版本为winzipaes_src_20120416.zip,本⽰例就是在此基础上编写。
详述项⽬使⽤很简单,利⽤源码⾃⼰导出⼀个jar⽂件,在项⽬中引⽤即可。
这⾥有⼀个需要注意的问题,就是如果给定ZIP⽂件没有密码,那么就不能使⽤该项⽬解压,如果压缩⽂件没有密码却使⽤该项⽬解压在这⾥会报⼀个异常,所以使⽤中需要注意:加密ZIP⽂件可以使⽤它解压,没有加密的就需要采取其它⽅式了。
此⽂就是采⽤修改后的winzipaes编写,并记录详细修改步骤。
⽰例在研究该项⽬时写了⼀个⼯具类,本来准备⽤在项⽬中,最后找到了更好的解决⽅案zip4j来代替,所以最终没有采⽤。
package com.ninemax.demo.zip.decrypt;import java.io.File;import java.io.IOException;import java.util.List;import java.util.zip.DataFormatException;import mons.io.FileUtils;import de.idyl.winzipaes.AesZipFileDecrypter;import de.idyl.winzipaes.AesZipFileEncrypter;import de.idyl.winzipaes.impl.AESDecrypter;import de.idyl.winzipaes.impl.AESDecrypterBC;import de.idyl.winzipaes.impl.AESEncrypter;import de.idyl.winzipaes.impl.AESEncrypterBC;import de.idyl.winzipaes.impl.ExtZipEntry;/*** 压缩指定⽂件或⽬录为ZIP格式压缩⽂件* ⽀持中⽂(修改源码后)* ⽀持密码(仅⽀持256bit的AES加密解密)* 依赖bcprov项⽬(bcprov-jdk16-140.jar)** @author zyh*/public class DecryptionZipUtil {/*** 使⽤指定密码将给定⽂件或⽂件夹压缩成指定的输出ZIP⽂件* @param srcFile 需要压缩的⽂件或⽂件夹* @param destPath 输出路径* @param passwd 压缩⽂件使⽤的密码*/public static void zip(String srcFile,String destPath,String passwd) {AESEncrypter encrypter = new AESEncrypterBC();AesZipFileEncrypter zipFileEncrypter = null;try {zipFileEncrypter = new AesZipFileEncrypter(destPath, encrypter);/*** 此⽅法是修改源码后添加,⽤以⽀持中⽂⽂件名*/zipFileEncrypter.setEncoding("utf8");File sFile = new File(srcFile);/*** AesZipFileEncrypter提供了重载的添加Entry的⽅法,其中:* add(File f, String passwd)* ⽅法是将⽂件直接添加进压缩⽂件** add(File f, String pathForEntry, String passwd)* ⽅法是按指定路径将⽂件添加进压缩⽂件* pathForEntry - to be used for addition of the file (path within zip file)*/doZip(sFile, zipFileEncrypter, "", passwd);} catch (IOException e) {e.printStackTrace();} finally {try {zipFileEncrypter.close();} catch (IOException e) {e.printStackTrace();}}}/*** 具体压缩⽅法,将给定⽂件添加进压缩⽂件中,并处理压缩⽂件中的路径* @param file 给定磁盘⽂件(是⽂件直接添加,是⽬录递归调⽤添加)* @param encrypter AesZipFileEncrypter实例,⽤于输出加密ZIP⽂件* @param pathForEntry ZIP⽂件中的路径* @param passwd 压缩密码* @throws IOException*/private static void doZip(File file, AesZipFileEncrypter encrypter,String pathForEntry, String passwd) throws IOException {if (file.isFile()) {pathForEntry += file.getName();encrypter.add(file, pathForEntry, passwd);return;}pathForEntry += file.getName() + File.separator;for(File subFile : file.listFiles()) {doZip(subFile, encrypter, pathForEntry, passwd);}}/*** 使⽤给定密码解压指定压缩⽂件到指定⽬录* @param inFile 指定Zip⽂件* @param outDir 解压⽬录* @param passwd 解压密码*/public static void unzip(String inFile, String outDir, String passwd) {File outDirectory = new File(outDir);if (!outDirectory.exists()) {outDirectory.mkdir();}AESDecrypter decrypter = new AESDecrypterBC();AesZipFileDecrypter zipDecrypter = null;try {zipDecrypter = new AesZipFileDecrypter(new File(inFile), decrypter);AesZipFileDecrypter.charset = "utf-8";/*** 得到ZIP⽂件中所有Entry,但此处好像与JDK⾥不同,⽬录不视为Entry* 需要创建⽂件夹,entry.isDirectory()⽅法同样不适⽤,不知道是不是⾃⼰使⽤错误 * 处理⽂件夹问题处理可能不太好*/List<ExtZipEntry> entryList = zipDecrypter.getEntryList();for(ExtZipEntry entry : entryList) {String eName = entry.getName();String dir = eName.substring(0, stIndexOf(File.separator) + 1);File extractDir = new File(outDir, dir);if (!extractDir.exists()) {FileUtils.forceMkdir(extractDir);}/*** 抽出⽂件*/File extractFile = new File(outDir + File.separator + eName);zipDecrypter.extractEntry(entry, extractFile, passwd);}} catch (IOException e) {e.printStackTrace();} catch (DataFormatException e) {e.printStackTrace();} finally {try {zipDecrypter.close();} catch (IOException e) {e.printStackTrace();}}}/*** 测试* @param args*/public static void main(String[] args) {/*** 压缩测试* 可以传⽂件或者⽬录*/// zip("M:\\ZIP\\test\\bb\\a\\t.txt", "M:\\ZIP\\test\\temp1.zip", "zyh");// zip("M:\\ZIP\\test\\bb", "M:\\ZIP\\test\\temp2.zip", "zyh");unzip("M:\\ZIP\\test\\temp2.zip", "M:\\ZIP\\test\\temp", "zyh");}}压缩多个⽂件时,有两个⽅法(第⼀种没试):(1)预先把多个⽂件压缩成zip,然后调⽤enc.addAll(inZipFile, password);⽅法将多个zip⽂件加进来。
java解压代码
java解压代码Java中的文件压缩和解压缩是非常常见的操作,它对于压缩和解压缩文件的大小和传输速度起着很大的作用。
Java中提供了一些类用于文件压缩和解压缩,例如ZipInputStream、ZipOutputStream和GZIPInputStream、GZIPOutputStream等等。
这些类使用起来非常简单,只需要了解其基本用法就可以轻松实现文件的压缩和解压缩,下面就来详细了解一下Java解压代码的实现方法。
1. ZipInputStream和ZipOutputStreamZipInputStream和ZipOutputStream可以用来压缩和解压缩Zip格式的文件,Zip格式是一种非常常见的文件格式,它可以用来打包多个文件,节省空间并且便于传输。
下面是一个简单的例子,演示如何使用ZipInputStream和ZipOutputStream来解压和压缩Zip格式的文件://解压缩文件public static void unzip(String zipFilePath, String destDirectory) throws IOException {File destDir = new File(destDirectory);if (!destDir.exists()) {destDir.mkdir();}ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));ZipEntry entry = zipIn.getNextEntry();while (entry != null) {String filePath = destDirectory + File.separator + entry.getName();if (!entry.isDirectory()) {//如果是文件则直接写入文件BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));byte[] bytesIn = new byte[4096];int read = 0;while ((read = zipIn.read(bytesIn)) != -1) { bos.write(bytesIn, 0, read);}bos.close();} else {//如果是文件夹则创建文件夹File dir = new File(filePath);dir.mkdir();}zipIn.closeEntry();entry = zipIn.getNextEntry();}zipIn.close();}//压缩文件public static void zip(String sourceDirectory, String zipFilePath) throws IOException {ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));File fileToZip = new File(sourceDirectory);zipFile(fileToZip, fileToZip.getName(), zipOut);zipOut.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();}使用ZipInputStream和ZipOutputStream时需要注意以下事项:-每个ZipEntry代表一个文件或者文件夹,ZipInputStream先返回文件夹的信息,再返回文件的信息。
hutool的ziputil用法
hutool的ziputil用法Hutool的zipUtil是一个用于压缩和解压缩zip文件的工具类。
下面是zipUtil的部分用法示例:```javapublic static void zipList(){// 指定压缩文件名称File zipFile = new File("D:\\压缩.zip");// 可以添加文件,也可以添加文件夹List<File> fileList = CollUtil.newArrayList();fileList.add(new File("e:\\u.item"));fileList.add(new File("e:\\u.data"));fileList.add(new File("e:\\360Downloads"));fileList.add(new File("E:\\2023\\202306\\hm\\pom.xml"));ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, fileList.toArray(new File[fileList.size()]));}```上述代码中,使用了`ZipUtil.zip`方法压缩多个文件,这些文件可以位于不同的路径下。
在参数中,可以添加文件列表,`withSrcDir`参数的作用是,如果压缩的是目录,`true`表示压缩时包含目录本身,`false`表示压缩时不包含目录本身。
你可以根据实际需求调整参数和代码,以满足不同的压缩和解压缩需求。
如果你还有其他关于 Hutool 的问题,请随时向我提问。
java压缩数据方法
java压缩数据方法Java是一种强大的编程语言,为了更好地节省空间和方便文件传输,Java提供了一些压缩数据的方法。
一、Zip压缩Zip压缩是Java中最常用的压缩方法,它主要使用java.util.zip包下的ZipOutputStream和ZipEntry类。
ZipOutputStream可以将文件压缩成Zip文件,而ZipEntry则代表ZipFile中的每一个文件。
Zip压缩的步骤如下:1. 创建ZipOutputStream对象,并指定输出的Zip文件名。
2. 遍历需要压缩的文件路径,使用FileInputStream的方式读取文件。
3. 创建ZipEntry对象并设置Entry名称。
4. 将ZipEntry对象写入ZipOutputStream中。
5. 将需要压缩的文件写入到ZipOutputStream中。
6. 关闭ZipOutputStream和FileInputStream对象。
二、Gzip压缩除了Zip压缩,Java还提供了Gzip压缩方法,它可以让数据更好地适配网络传输。
Gzip压缩主要使用java.util.zip包下的GZIPOutputStream和GZIPInputStream类。
Gzip压缩的步骤如下:1. 创建GZIPOutputStream对象,该对象用于压缩数据。
2. 写入需要压缩的数据。
3. 结束压缩并关闭流。
4. 创建GZIPInputStream对象,该对象用于解压缩数据。
5. 将需要解压缩的数据传入GZIPInputStream对象。
6. 读取解压缩后的数据。
7. 关闭GZIPInputStream对象。
三、Deflate压缩类似于Gzip压缩,Java还提供了Deflate压缩方法。
Deflate压缩主要使用java.util.zip包下的Deflater和Inflater类。
Deflate压缩的步骤如下:1. 创建Deflater对象,该对象用于压缩数据。
Java多文件以ZIP压缩包导出的实现方法
Java多⽂件以ZIP压缩包导出的实现⽅法本⽂实例为⼤家分享了Java多⽂件以ZIP压缩包导出的具体代码,供⼤家参考,具体内容如下1、使⽤java实现吧服务器的图⽚打包成⼀个zip格式的压缩包导出,多个⽂件打包导出。
2、代码如下:**ImageByteUtil.java**public class ImageByteUtil{private static float QUALITY = 0.6f;public static void compressZip(List<File> listfiles, OutputStream output,String encode, boolean compress,String alias){ZipOutputStream zipStream = null;try {zipStream = new ZipOutputStream(output);for (File file : listfiles){compressZip(file, zipStream, compress,alias+"_"+(listfiles.indexOf(file)+1));}} catch (Exception e) {e.printStackTrace();}finally {try {if (zipStream != null) {zipStream.close();}} catch (IOException e) {e.printStackTrace();}}}private static void compressZip(File file, ZipOutputStream zipStream,boolean compress,String alias) throws Exception{FileInputStream input = null;try {input = new FileInputStream(file);//zip(input, zipStream, file.getName(), compress);zip(input, zipStream, alias+"."+file.getName().substring(file.getName().lastIndexOf(".")+1), compress);} catch (Exception e) {e.printStackTrace();}finally {try {if(input != null)input.close();} catch (IOException e) {e.printStackTrace();}}}private static void zip(InputStream input, ZipOutputStream zipStream,String zipEntryName, boolean compress) throws Exception{byte[] bytes = null;BufferedInputStream bufferStream = null;try {if(input == null)throw new Exception("获取压缩的数据项失败! 数据项名为:" + zipEntryName);// 压缩条⽬不是具体独⽴的⽂件,⽽是压缩包⽂件列表中的列表项,称为条⽬,就像索引⼀样ZipEntry zipEntry = new ZipEntry("图⽚/"+zipEntryName);// 定位到该压缩条⽬位置,开始写⼊⽂件到压缩包中zipStream.putNextEntry(zipEntry);if (compress) {bytes = pressOfQuality(input, 0);zipStream.write(bytes, 0, bytes.length);} else {bytes = new byte[1024 * 5];// 读写缓冲区bufferStream = new BufferedInputStream(input);// 输⼊缓冲流int read = 0;while ((read = bufferStream.read(bytes)) != -1) {zipStream.write(bytes, 0, read);}}} catch (IOException e) {e.printStackTrace();} finally {try {if (null != bufferStream)bufferStream.close();} catch (IOException e) {e.printStackTrace();}}}public static byte[] compressOfQuality(File file, float quality) throws Exception{byte[] bs = null;InputStream input = null;try {input = new FileInputStream(file);bs = compressOfQuality(input,quality);} catch (Exception e) {e.printStackTrace();} finally {try {if (input != null)input.close();} catch (IOException e) {e.printStackTrace();}}return bs;}public static byte[] compressOfQuality(InputStream input, float quality)throws Exception {ByteArrayOutputStream output = null;try {output = new ByteArrayOutputStream();if(quality == 0){Thumbnails.of(input).scale(1f).outputQuality(QUALITY).toOutputStream(output);} else {Thumbnails.of(input).scale(1f).outputQuality(quality).toOutputStream(output);}return output.toByteArray();} catch (Exception e) {e.printStackTrace();} finally {try {if (output != null)output.close();} catch (IOException e) {e.printStackTrace();}}return null;}}**Main.java**public static void main(String[] args){//要导出的⽂件集合,添加⾃⼰需要导出的⽂件List<File> ListFiles = new ArrayList<>();//调⽤⼯具类,参数说明(需要导出的⽂件集,ByteArrayOutputStream对象,编码,是否压缩【true,false】,⽂件名称前缀) pressZip(ListFiles, out, "UTF-8", false,"LWJ");//指定导出格式ReturnContext.addParam("exportFileName","extFile.zip");ReturnContext.addParam("mimeType", "zip");return in;}3、此功能是根据在开发过程中项⽬需要实现的,测试可正常使⽤,可更改定制。
Java中的文件压缩与解压缩方法
Java中的文件压缩与解压缩方法在日常的开发工作中,文件的压缩与解压缩是一个常见的需求。
Java作为一种广泛使用的编程语言,提供了丰富的类库和方法来实现这一功能。
本文将介绍Java中常用的文件压缩与解压缩方法,并探讨它们的优缺点以及适用场景。
一、文件压缩方法1. Zip压缩Zip是一种常见的文件压缩格式,Java提供了java.util.zip包来实现对Zip文件的压缩和解压缩操作。
使用Zip压缩文件可以将多个文件或文件夹打包成一个压缩文件,方便传输和存储。
在Java中,可以使用ZipOutputStream类来创建一个Zip文件,并使用ZipEntry类来表示Zip文件中的每个文件或文件夹。
下面是一个简单的示例代码:```javaimport java.io.*;import java.util.zip.*;public class ZipUtil {public static void zipFile(String sourceFilePath, String zipFilePath) {try {FileOutputStream fos = new FileOutputStream(zipFilePath);ZipOutputStream zos = new ZipOutputStream(fos);File file = new File(sourceFilePath);zipFile(file, file.getName(), zos);zos.close();fos.close();} catch (IOException e) {e.printStackTrace();}}private static void zipFile(File file, String fileName, ZipOutputStream zos) throws IOException {if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files) {zipFile(f, fileName + "/" + f.getName(), zos);}} else {FileInputStream fis = new FileInputStream(file);ZipEntry zipEntry = new ZipEntry(fileName);zos.putNextEntry(zipEntry);byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) > 0) {zos.write(buffer, 0, len);}fis.close();}}}```上述代码中,zipFile方法用于递归压缩文件夹中的所有文件和子文件夹。
java压缩文件解压:调用WinRAR5命令强于自己写代码实现
java压缩⽂件解压:调⽤WinRAR5命令强于⾃⼰写代码实现最近,⼿上维护着⼀个⼏年前的系统,技术是⽤的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是⽤java实现的1、解压rar格式,采⽤的是java-unrar-0.3.jar2、解压zip格式,采⽤的是commons-compress-1.4.1.jar但最近根据⽤户反馈的问题,发现系统存在两个关于压缩⽂件解压的问题:1、有些压缩⽂件解压之后出现中⽂乱码;2、有些压缩⽂件根本不能解压为了弥补上述两个问题,在之前代码的基础上打了⼀些补丁,来解决zip压缩包乱码的问题,思路⼤概是:1、采⽤GBK编码解压2、递归遍历解压的⽂件名是否存在中⽂乱码,这⽤到了⽹上很常⽤的中⽂检测正则表⽰式,[\u4e00-\u9fa5]+3、如果存在中⽂乱码,则采⽤UTF-8编码解压替换后,还是有⼈反映乱码问题,烦~~~第⼆个问题报错如下(出现在有些rar格式解压时):WARNING: exception in archive constructor maybe file is encrypted or curruptde.innosystec.unrar.exception.RarException: badRarArchiveat de.innosystec.unrar.Archive.readHeaders(Archive.java:238)at de.innosystec.unrar.Archive.setFile(Archive.java:122)at de.innosystec.unrar.Archive.<init>(Archive.java:106)at de.innosystec.unrar.Archive.<init>(Archive.java:96)at com.reverse.zipFile.CopyOfZipFileUtil.unrar(CopyOfZipFileUtil.java:242)at com.reverse.zipFile.CopyOfZipFileUtil.main(CopyOfZipFileUtil.java:303)借助百度、⾕歌找资料发现:1、java解压⽂件有两种⽅式,⼀是⾃⼰写代码,⼆是调⽤压缩软件CMD执⾏2、第⼆个错误是由于WinRAR5之后,在rar格式的基础上,推出了另⼀种rar,叫RAR5,⽽java-unrar解析不了这种格式查看rar格式属性可以通过右键 —> 属性查看,如图因此需要舍弃代码解压的⽅式,改为CMD调⽤的⽅式,虽然压缩软件有很多,但从⽹上能找到执⾏命令的,也就WinRAR了,所以我们采⽤WinRAR5之后的版本解决,5之前的版本肯定是不⾏的了使⽤cmd⽅式效果如何呢?既能解决中⽂乱码问题,⼜能解压RAR5压缩⽂件,⽽且代码量还更少了,⽀持的格式也更多了。
Java解压zip文件
java解压zip文件(由于zip包使用Winra工具打的包,他的默认编码格式是gbk,所以在解压zip包中的中文文件明的文件的时候就会出现IllegalArguementException异常,解决方法就是在ZipInputStream 的getUTF8String()方法中加上如下代码 String s=newString(b,off,len,"gbk"); return s;编译后将ZipInputStream 的class文件覆盖jdk\jre\rt.jar中java.util.zip包中的ZipInputStream.class)try {// ZipInputStream zis = new ZipInputStream(new FileInputStream(// "Archive.zip"));ZipInputStream zis = new ZipInputStream(newFileInputStream("e.zip"));// ZipFile z=new ZipFile(Archive.zip);ZipEntry ze = null;while ((ze=zis.getNextEntry()) != null) {if (!ze.isDirectory()) {System.out.println(ze.getName());// File child = new File(ze.getName());String filename=ze.getName();int at=stIndexOf("/");System.out.println(at);if(at!=-1){String path=filename.substring(0, at);File pa=new File(path);pa.mkdirs();FileOutputStream outputStream = newFileOutputStream(pa+filename.substring(at));byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = zis.read(buffer)) > 0) {outputStream.write(buffer, 0, bytesRead);}outputStream.flush();outputStream.close();}else{FileOutputStream outputStream = new FileOutputStream(filename); byte[] buffer = new byte[1024];int bytesRead = 0;while ((bytesRead = zis.read(buffer)) > 0) {outputStream.write(buffer, 0, bytesRead);}outputStream.flush();outputStream.close();}}}zis.close();} catch (Exception e) {e.printStackTrace();}。
java解压代码
Java解压代码1. 简介在日常开发过程中,我们经常会遇到需要对文件进行解压缩的情况。
Java提供了多种方式来解压文件,本文将详细介绍Java解压代码的实现方法和常用技巧。
2. 解压方式Java提供了多种解压方式,包括使用ZipInputStream和ZipEntry类、使用Java.util.zip包、使用第三方库等。
下面将详细介绍这些方式的使用方法。
2.1 使用ZipInputStream和ZipEntry类ZipInputStream和ZipEntry类是Java提供的用于处理Zip文件的工具类。
通过ZipInputStream可以逐个读取Zip文件中的Entry,并将其解压到指定目录。
下面是一个使用ZipInputStream和ZipEntry类解压Zip文件的示例代码:import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.io.FileOutputStream;import java.io.IOException;public class UnzipExample {public static void main(String[] args) {String zipFilePath = "path/to/your/zip/file.zip";String destDir = "path/to/your/destination/directory/";try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zip FilePath))) {ZipEntry entry = zipIn.getNextEntry();while (entry != null) {String filePath = destDir + File.separator + entry.getName();if (!entry.isDirectory()) {extractFile(zipIn, filePath);} else {File dir = new File(filePath);dir.mkdirs();}zipIn.closeEntry();entry = zipIn.getNextEntry();}} catch (IOException e) {e.printStackTrace();}}private static void extractFile(ZipInputStream zipIn, String filePath) thr ows IOException {try (FileOutputStream fos = new FileOutputStream(filePath)) {byte[] buffer = new byte[1024];int len;while ((len = zipIn.read(buffer)) > 0) {fos.write(buffer, 0, len);}}}}以上代码将解压指定路径下的Zip文件到目标目录。
Java字符串的压缩与解压缩的两种方法
Java字符串的压缩与解压缩的两种⽅法应⽤场景当字符串太长,需要将字符串值存⼊数据库时,如果字段长度不够,则会出现插⼊失败;或者需要进⾏Http传输时,由于参数长度过长造成http传输失败等。
字符串压缩与解压⽅法⽅法⼀:⽤ Java8中的gzip/*** 使⽤gzip压缩字符串* @param str 要压缩的字符串* @return*/public static String compress(String str) {if (str == null || str.length() == 0) {return str;}ByteArrayOutputStream out = new ByteArrayOutputStream();GZIPOutputStream gzip = null;try {gzip = new GZIPOutputStream(out);gzip.write(str.getBytes());} catch (IOException e) {e.printStackTrace();} finally {if (gzip != null) {try {gzip.close();} catch (IOException e) {e.printStackTrace();}}}return new sun.misc.BASE64Encoder().encode(out.toByteArray());}/*** 使⽤gzip解压缩* @param compressedStr 压缩字符串* @return*/public static String uncompress(String compressedStr) {if (compressedStr == null) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = null;GZIPInputStream ginzip = null;byte[] compressed = null;String decompressed = null;try {compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);in = new ByteArrayInputStream(compressed);ginzip = new GZIPInputStream(in);byte[] buffer = new byte[1024];int offset = -1;while ((offset = ginzip.read(buffer)) != -1) {out.write(buffer, 0, offset);}decompressed = out.toString();} catch (IOException e) {e.printStackTrace();} finally {if (ginzip != null) {try {ginzip.close();} catch (IOException e) {}}if (in != null) {try {in.close();} catch (IOException e) {}}if (out != null) {try {out.close();} catch (IOException e) {}}}return decompressed;}⽅法⼆:⽤mons.codec.binary.Base64/*** 使⽤mons.codec.binary.Base64压缩字符串* @param str 要压缩的字符串* @return*/public static String compress(String str) {if (str == null || str.length() == 0) {return str;}return Base64.encodeBase64String(str.getBytes());}/*** 使⽤mons.codec.binary.Base64解压缩* @param compressedStr 压缩字符串* @return*/public static String uncompress(String compressedStr) {if (compressedStr == null) {return null;}return Base64.decodeBase64(compressedStr);}注意事项在web项⽬中,服务器端将加密后的字符串返回给前端,前端再通过ajax请求将加密字符串发送给服务器端处理的时候,在http传输过程中会改变加密字符串的内容,导致服务器解压压缩字符串发⽣异常:java.util.zip.ZipException: Not in GZIP format解决⽅法:在字符串压缩之后,将压缩后的字符串BASE64加密,在使⽤的时候先BASE64解密再解压即可。
java文件压缩和解压(ZipInputStream,ZipOutputStream)
java⽂件压缩和解压(ZipInputStream,ZipOutputStream) 最近在看java se 的IO 部分,看到 java 的⽂件的压缩和解压⽐较有意思,主要⽤到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对⽂件进⾏压缩,还可以对⽂件夹进⾏压缩和解压。
ZipInputStream位于java.util.zip包下。
下⾯是它的API,⽐较简单。
ZipOutputStream位于java.util.zip包下。
下⾯是它的API,⽐较简单。
⽂件的压缩1public class TestFile2 {3public static void main ( String [ ] args ) throws IOException4 {5// new a file input stream6 FileInputStream fis = new FileInputStream (7 "/home/liangruihua/ziptest/1.txt" ) ;8 BufferedInputStream bis = new BufferedInputStream ( fis ) ;910// new a zipPutputStream11// /home/liangruihua/ziptest/1.zip -- the out put file path and12// name13 ZipOutputStream zos = new ZipOutputStream (14new FileOutputStream (15 "/home/liangruihua/ziptest/1.zip" ) ) ;16 BufferedOutputStream bos = new BufferedOutputStream ( zos ) ;1718// set the file name in the .zip file19 zos.putNextEntry ( new ZipEntry ( "1.txt" ) ) ;2021// set the declear22 zos.setComment ( "by liangruihua test!" ) ;2324byte [ ] b = new byte [ 100 ] ;25while ( true )26 {27int len = bis.read ( b ) ;28if ( len == - 1 )29break ;30 bos.write ( b , 0 , len ) ;31 }32 fis.close ( ) ;33 zos.close ( ) ;34 }35 }⽂件夹的压缩1public class TestDir2 {3public static void main ( String [ ] args ) throws IOException4 {5// the file path need to compress6 File file = new File ( "/home/liangruihua/ziptest/test" ) ;7 ZipOutputStream zos = new ZipOutputStream (8new FileOutputStream (9 "/home/liangruihua/ziptest/test.zip" ) ) ;1011// judge the file is the directory12if ( file.isDirectory ( ) )13 {14// get the every file in the directory15 File [ ] files = file.listFiles ( ) ;1617for ( int i = 0 ; i < files.length ; i ++ )18 {19// new the BuuferedInputStream20 BufferedInputStream bis = new BufferedInputStream (21new FileInputStream (22 files [ i ] ) ) ;23// the file entry ,set the file name in the zip24// file25 zos.putNextEntry ( new ZipEntry ( file26 .getName ( )27 + file.separator28 + files [ i ].getName ( ) ) ) ;29while ( true )30 {31byte [ ] b = new byte [ 100 ] ;32int len = bis.read ( b ) ;33if ( len == - 1 )34break ;35 zos.write ( b , 0 , len ) ;36 }3738// close the input stream39 bis.close ( ) ;40 }4142 }43// close the zip output stream44 zos.close ( ) ;45 }46 }⽂件的解压1public class TestZipInputStream2 {3public static void main ( String [ ] args ) throws ZipException ,4 IOException5 {6// get a zip file instance7 File file = new File ( "/home/liangruihua/ziptest/test.zip" ) ;89// get a ZipFile instance10 ZipFile zipFile = new ZipFile ( file ) ;1112// create a ZipInputStream instance13 ZipInputStream zis = new ZipInputStream ( new FileInputStream (14 file ) ) ;1516// create a ZipEntry instance , lay the every file from17// decompress file temporarily18 ZipEntry entry = null ;1920// a circle to get every file21while ( ( entry = zis.getNextEntry ( ) ) != null )22 {23 System.out.println ( "decompress file :"24 + entry.getName ( ) ) ;2526// define the path to set the file27 File outFile = new File ( "/home/liangruihua/ziptest/"28 + entry.getName ( ) ) ;2930// if the file's parent directory wasn't exits ,than31// create the directory32if ( ! outFile.getParentFile ( ).exists ( ) )33 {34 outFile.getParentFile ( ).mkdir ( ) ;35 }3637// if the file not exits ,than create the file38if ( ! outFile.exists ( ) )39 {40 outFile.createNewFile ( ) ;41 }4243// create an input stream44 BufferedInputStream bis = new BufferedInputStream (45 zipFile.getInputStream ( entry ) ) ;4647// create an output stream48 BufferedOutputStream bos = new BufferedOutputStream ( 49new FileOutputStream ( outFile ) ) ;50byte [ ] b = new byte [ 100 ] ;51while ( true )52 {53int len = bis.read ( b ) ;54if ( len == - 1 )55break ;56 bos.write ( b , 0 , len ) ;57 }58// close stream59 bis.close ( ) ;60 bos.close ( ) ;61 }62 zis.close ( ) ;6364 }65 }。
Java中的文件压缩与解压缩
Java中的文件压缩与解压缩文件压缩与解压缩在Java开发中是一个常见的需求,通过压缩可以减小文件的大小,提高文件传输的速度和效率。
在本文中,我们将介绍使用Java实现文件压缩和解压缩的方法和技巧。
一、使用Java的ZipOutputStream类进行文件压缩要实现文件压缩,可以使用Java提供的ZipOutputStream类。
该类可以创建一个新的ZIP文件并向其中写入数据。
以下是使用ZipOutputStream类进行文件压缩的示例代码:```javaimport java.io.FileOutputStream;import java.io.FileInputStream;import java.io.BufferedOutputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class FileCompressor {public static void main(String[] args) {String sourceFile = "path/to/source/file.txt";String compressedFile = "path/to/compressed/file.zip";try {FileOutputStream fos = new FileOutputStream(compressedFile); BufferedOutputStream bos = new BufferedOutputStream(fos); ZipOutputStream zos = new ZipOutputStream(bos);FileInputStream fis = new FileInputStream(sourceFile);byte[] buffer = new byte[1024];zos.putNextEntry(new ZipEntry(sourceFile));int length;while ((length = fis.read(buffer)) > 0) {zos.write(buffer, 0, length);}fis.close();zos.closeEntry();zos.close();} catch (Exception e) {e.printStackTrace();}}}```在上述示例代码中,我们首先创建一个源文件 `sourceFile` 和一个压缩后的文件 `compressedFile` 的路径。
Android实现zip文件压缩及解压缩的方法
Android实现zip⽂件压缩及解压缩的⽅法本⽂实例讲述了Android实现zip⽂件压缩及解压缩的⽅法。
分享给⼤家供⼤家参考。
具体如下:DirTraversal.java如下:package com.once;import java.io.File;import java.util.ArrayList;import java.util.LinkedList;/*** ⽂件夹遍历* @author once**/public class DirTraversal {//no recursionpublic static LinkedList<File> listLinkedFiles(String strPath) {LinkedList<File> list = new LinkedList<File>();File dir = new File(strPath);File file[] = dir.listFiles();for (int i = 0; i < file.length; i++) {if (file[i].isDirectory())list.add(file[i]);elseSystem.out.println(file[i].getAbsolutePath());}File tmp;while (!list.isEmpty()) {tmp = (File) list.removeFirst();if (tmp.isDirectory()) {file = tmp.listFiles();if (file == null)continue;for (int i = 0; i < file.length; i++) {if (file[i].isDirectory())list.add(file[i]);elseSystem.out.println(file[i].getAbsolutePath());}} else {System.out.println(tmp.getAbsolutePath());}}return list;}//recursionpublic static ArrayList<File> listFiles(String strPath) {return refreshFileList(strPath);}public static ArrayList<File> refreshFileList(String strPath) {ArrayList<File> filelist = new ArrayList<File>();File dir = new File(strPath);File[] files = dir.listFiles();if (files == null)return null;for (int i = 0; i < files.length; i++) {if (files[i].isDirectory()) {refreshFileList(files[i].getAbsolutePath());} else {if(files[i].getName().toLowerCase().endsWith("zip"))filelist.add(files[i]);}}return filelist;}}ZipUtils.java如下:package com.once;import java.io.*;import java.util.ArrayList;import java.util.Collection;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipException;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/*** Java utils 实现的Zip⼯具** @author once*/public class ZipUtils {private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte/*** 批量压缩⽂件(夹)** @param resFileList 要压缩的⽂件(夹)列表* @param zipFile ⽣成的压缩⽂件* @throws IOException 当压缩过程出错时抛出*/public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException {ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream( zipFile), BUFF_SIZE));for (File resFile : resFileList) {zipFile(resFile, zipout, "");}zipout.close();}/*** 批量压缩⽂件(夹)** @param resFileList 要压缩的⽂件(夹)列表* @param zipFile ⽣成的压缩⽂件* @param comment 压缩⽂件的注释* @throws IOException 当压缩过程出错时抛出*/public static void zipFiles(Collection<File> resFileList, File zipFile, String comment)throws IOException {ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream( zipFile), BUFF_SIZE));for (File resFile : resFileList) {zipFile(resFile, zipout, "");}zipout.setComment(comment);zipout.close();}/*** 解压缩⼀个⽂件** @param zipFile 压缩⽂件* @param folderPath 解压缩的⽬标⽬录* @throws IOException 当解压缩过程出错时抛出*/public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException {File desDir = new File(folderPath);if (!desDir.exists()) {desDir.mkdirs();}ZipFile zf = new ZipFile(zipFile);for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {ZipEntry entry = ((ZipEntry)entries.nextElement());InputStream in = zf.getInputStream(entry);String str = folderPath + File.separator + entry.getName();str = new String(str.getBytes("8859_1"), "GB2312");File desFile = new File(str);if (!desFile.exists()) {File fileParentDir = desFile.getParentFile();if (!fileParentDir.exists()) {fileParentDir.mkdirs();}desFile.createNewFile();}OutputStream out = new FileOutputStream(desFile);byte buffer[] = new byte[BUFF_SIZE];int realLength;while ((realLength = in.read(buffer)) > 0) {out.write(buffer, 0, realLength);}in.close();out.close();}}/*** 解压⽂件名包含传⼊⽂字的⽂件** @param zipFile 压缩⽂件* @param folderPath ⽬标⽂件夹* @param nameContains 传⼊的⽂件匹配名* @throws ZipException 压缩格式有误时抛出* @throws IOException IO错误时抛出*/public static ArrayList<File> upZipSelectedFile(File zipFile, String folderPath,String nameContains) throws ZipException, IOException {ArrayList<File> fileList = new ArrayList<File>();File desDir = new File(folderPath);if (!desDir.exists()) {desDir.mkdir();}ZipFile zf = new ZipFile(zipFile);for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {ZipEntry entry = ((ZipEntry)entries.nextElement());if (entry.getName().contains(nameContains)) {InputStream in = zf.getInputStream(entry);String str = folderPath + File.separator + entry.getName();str = new String(str.getBytes("8859_1"), "GB2312");// str.getBytes("GB2312"),"8859_1" 输出// str.getBytes("8859_1"),"GB2312" 输⼊File desFile = new File(str);if (!desFile.exists()) {File fileParentDir = desFile.getParentFile();if (!fileParentDir.exists()) {fileParentDir.mkdirs();}desFile.createNewFile();}OutputStream out = new FileOutputStream(desFile);byte buffer[] = new byte[BUFF_SIZE];int realLength;while ((realLength = in.read(buffer)) > 0) {out.write(buffer, 0, realLength);}in.close();out.close();fileList.add(desFile);}}return fileList;}/*** 获得压缩⽂件内⽂件列表** @param zipFile 压缩⽂件* @return 压缩⽂件内⽂件名称* @throws ZipException 压缩⽂件格式有误时抛出* @throws IOException 当解压缩过程出错时抛出*/public static ArrayList<String> getEntriesNames(File zipFile) throws ZipException, IOException { ArrayList<String> entryNames = new ArrayList<String>();Enumeration<?> entries = getEntriesEnumeration(zipFile);while (entries.hasMoreElements()) {ZipEntry entry = ((ZipEntry)entries.nextElement());entryNames.add(new String(getEntryName(entry).getBytes("GB2312"), "8859_1"));}return entryNames;}/*** 获得压缩⽂件内压缩⽂件对象以取得其属性** @param zipFile 压缩⽂件* @return 返回⼀个压缩⽂件列表* @throws ZipException 压缩⽂件格式有误时抛出* @throws IOException IO操作有误时抛出*/public static Enumeration<?> getEntriesEnumeration(File zipFile) throws ZipException,IOException {ZipFile zf = new ZipFile(zipFile);return zf.entries();}/*** 取得压缩⽂件对象的注释** @param entry 压缩⽂件对象* @return 压缩⽂件对象的注释* @throws UnsupportedEncodingException*/public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException { return new String(entry.getComment().getBytes("GB2312"), "8859_1");}/*** 取得压缩⽂件对象的名称** @param entry 压缩⽂件对象* @return 压缩⽂件对象的名称* @throws UnsupportedEncodingException*/public static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException {return new String(entry.getName().getBytes("GB2312"), "8859_1");}/*** 压缩⽂件** @param resFile 需要压缩的⽂件(夹)* @param zipout 压缩的⽬的⽂件* @param rootpath 压缩的⽂件路径* @throws FileNotFoundException 找不到⽂件时抛出* @throws IOException 当压缩过程出错时抛出*/private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath)throws FileNotFoundException, IOException {rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator)+ resFile.getName();rootpath = new String(rootpath.getBytes("8859_1"), "GB2312");if (resFile.isDirectory()) {File[] fileList = resFile.listFiles();for (File file : fileList) {zipFile(file, zipout, rootpath);}} else {byte buffer[] = new byte[BUFF_SIZE];BufferedInputStream in = new BufferedInputStream(new FileInputStream(resFile),BUFF_SIZE);zipout.putNextEntry(new ZipEntry(rootpath));int realLength;while ((realLength = in.read(buffer)) != -1) {zipout.write(buffer, 0, realLength);}in.close();zipout.flush();zipout.closeEntry();}}}希望本⽂所述对⼤家的Android程序设计有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
menuitem neww= new menuitem("new");
neww.addactionlistener(this);
file.add(neww);
menuitem open=new menuitem("open");
open.addactionlistener(this);
dispose();∥关闭窗口
system.exit(0);∥关闭程序
}
else {
system.out.println("no this command!");
}
}
}
if ("new".equals(arg)) randomdata();
else if ("open".equals(arg)) openfile();
else if ("save".equals(arg)) savefile();
else if ("exit".equals(arg)){
∥用zip输入流构建datainputstream
doc=dis.readutf();∥读取文件内容
dis.close();∥关闭文件
doczipsize = f.length();∥获取zip文件长度
showtextandinfo();∥显示数据
exit.addactionlistener(this);
file.add(exit);
∥随机生成的数据文件的多行文本显示域
add("center",textarea = new textarea());
∥提示文本原始大小、压缩大小的单行文本显示域
·类zipoutputstream
zipoutputstream实现了zip压缩文件的写输出流,支持压缩和非压缩entry。下面是它的
几个函数:
public zipoutputstream(outputstream out);
∥利用输出流out构造一个zip输出流。
add("south",infotip = new textfield());
}
public static void main(string args[]){
testzip ok=new testzip();
ok.settitle("zip sample");
showtextandinfo();
}
private void openfile(){
∥打开zip文件,将文件内容读入doc字符串变量中。
filedialog dlg=new filedialog(this,"open",fil建zip压缩输入流
zipinputstream zipis=new zipinputstream(new fileinputstream(f));
zipis.getnextentry();
∥将输入流定位在当前entry数据项位置
datainputstream dis=new datainputstream(zipis);
textarea textarea; ∥显示数据文件的多行文本显示域
textfield infotip; ∥显示数据文件未压缩大小及压缩大小单行文本显示域
string doc; ∥存储随机生成的数据
long doczipsize = 0;∥压缩数据文件的大小
os.writeutf(doc);∥将随机生成的数据写入文件中
os.close();∥关闭数据流
doczipsize = f.length();
∥获取压缩文件的长度
showtextandinfo();∥显示数据
}
catch(ioexception ioe){
file.add(open);
menuitem save=new menuitem("save");
save.addactionlistener(this);
file.add(save);
menuitem exit=new menuitem("exit");
dlg.show();
string filename=dlg.getdirectory()+dlg.getfile();
try{
∥创建一个文件实例
file f=new file(filename);
if(!f.exists()) return; ∥文件不存在,则返回
public void setmethod(int method);
∥设置entry压缩方法,缺省值为deflated。
public void putnextentry(zipentry newe);
∥如果当前的entry存在且处于激活状态时,关闭它,在zip文件中写入新的entry-newe
zipos.putnextentry(new zipentry("zip"));
∥生成一个zip entry,写入文件输出流中,并将输出流定位于entry起始处。
dataoutputstream os=new dataoutputstream(zipos);
∥用zip输出流构建dataoutputstream;
并将数据流定位于entry数据项的起始位置,压缩方法为setmethod指定的方法。
·类zipinputstream
zipinputstream实现了zip压缩文件的读输入流,支持压缩和非压缩entry。下面是它的
几个函数:
public zipinputstream(inputstream in);
double rdm=math.random()*10;
doc=doc+new double(rdm).tostring();
if(i%5 == 0) doc=doc+"\n";
else doc=doc+" ";
}
doczipsize = 0;
ok.setsize(600,300);
ok.show();
}
private void randomdata(){
∥随机生成50个double数据,并放在doc字符串变量中。
doc="";
for(int i=1;i<51;i++){
infotip.settext("uncompressed size: "+doc.length()+"compressed size: "+dc zipsize);
}
public void actionperformed(actionevent e){
string arg = e.getactioncommand();
zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的
数据项存储压缩数据。
与zip文件有关的几个java类
·类zipentry
public zipentry(string name);
name为指定的数据项名。
system.out.println(ioe);
}
}
private void showtextandinfo(){
∥显示数据文件和压缩信息
textarea.replacerange(doc,0,textarea.gettext().length());
程序代码及其注释
下列的程序实现了数据文件zip方式的压缩和解压缩方法。randomdata()函数随机生成
50个double数据,并放在doc字符串变量中;openfile()函数读取zip压缩文件;savefile()函数
将随机生成的数据存到zip格式的压缩文件中。
dlg.show();
string filename=dlg.getdirectory()+dlg.getfile();
try{
∥创建一个文件实例
file f=new file(filename);
if(!f.exists()) return; ∥文件不存在,则返回
∥用文件输出流构建zip压缩输出流
zipoutputstream zipos=new zipoutputstream(new fileoutputstream(f));
zipos.setmethod(zipoutputstream.deflated); ∥设置压缩方法
}
catch(ioexception ioe){
system.out.println(ioe);
}
}
private void savefile(){
∥打开zip文件,将doc字符串变量写入zip文件中。
filedialog dlg=new filedialog(this,"save",filedialog.save);
∥利用输入流in构造一个zip输出流。
public zipentry getnextentry();
∥返回zip文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。
public void closeentry();
∥关闭当前的zip entry,并将数据流定位于下一个entry的起始位置。