java zip打包与乱码的解决

使用java在linux中将多个文件打包为zip,并解决中文文件名乱码 近两天在开发过程中碰到一个需求,需要将服务器上的多个文件打包为ZIP,并进行下载。现将打包核心代码贴出来,以便相互交流: /** * * @param srcfile 需要打包为zip的文件集合 * @param zipfile 创建的zip文件 */ public void zipFiles(List<File> srcfile, File zipfile) { byte[] buf = new... 阅读详情
关于 java zip 打包用的场景还是有不少,包括在归档的时候,还有就是在提交数据的时候,一般都会采用这种方式。但是这里面最麻烦的就是java乱码的问题。

解决乱码的问题主要是引用apache的包ant.jar。然后注意下面红色代码部分,java自带的包中也有这两个类。如果乱码最好是采用apache的这两个类。这样才会有设置编码的 zos.setEncoding("gbk") 这个方法。这样就可解决java zip 打包的知码问题。



下面是演示的 java代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipFile;

//这里注意不能采用java下面的类包,不然没有设置编码的方法

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;


/**
* @Copyright @ 2012 All right reserved
* @version 创建时间:Created on 2012-12-19
* @author 作者:Create by www.360buyli.com
* @Email: 360buyli@gmail.com
* @description eclipse注释模板
*/

public class ZipUtil {

public static final String ZIP_FILENAME = ""; // 需要解压缩的文件名
public static final String ZIP_DIR = ""; // 需要压缩的文件夹
public static final String UN_ZIP_DIR = ""; // 要解压的文件目录
public static final int BUFFER = 1024; // 缓存大小



public static void main(String[] args) {
  try {
   zipFile("F:\\page","F:\\page\\demo.zip");
  } catch (Exception e) {
   e.printStackTrace();
  }
}

public static void zipFile(String baseDir, String fileName)
   throws Exception {
  List fileList = getSubFiles(new File(baseDir));
  ZipOutputStream zos = new ZipOutputStream(
    new FileOutputStream(fileName));
  ZipEntry ze = null;
  byte[] buf = new byte[BUFFER];
  int readLen = 0;
  for (int i = 0; i < fileList.size(); i++) {
   File f = (File) fileList.get(i);
   ze = new ZipEntry(getAbsFileName(baseDir, f));
   ze.setSize(f.length());
  
   ze.setTime(f.lastModified());
   zos.putNextEntry(ze);
   InputStream is = new BufferedInputStream(new FileInputStream(f));
   while ((readLen = is.read(buf, 0, BUFFER)) != -1) {
    zos.write(buf, 0, readLen);
   }
   is.close();
  }
  zos.setEncoding("gbk");
  zos.close();
}

private static String getAbsFileName(String baseDir, File realFileName) {
  File real = realFileName;
  File base = new File(baseDir);
  String ret = real.getName();
  while (true) {
   real = real.getParentFile();
   if (real == null)
    break;
   if (real.equals(base))
    break;
   else
    ret = real.getName() + "/" + ret;
  }
  return ret;
}

private static List getSubFiles(File baseDir) {
  List ret = new ArrayList();
  File[] tmp = baseDir.listFiles();
  for (int i = 0; i < tmp.length; i++) {
   if (tmp[i].isFile())
    ret.add(tmp[i]);
   if (tmp[i].isDirectory())
    ret.addAll(getSubFiles(tmp[i]));
  }
  return ret;
}

public static void upZipFile() throws Exception {
  ZipFile zfile = new ZipFile(ZIP_FILENAME);
  Enumeration zList = zfile.entries();
  ZipEntry ze = null;
  byte[] buf = new byte[1024];
  while (zList.hasMoreElements()) {
   ze = (ZipEntry) zList.nextElement();
   if (ze.isDirectory()) {
    File f = new File(ZIP_DIR + ze.getName());
    f.mkdir();
    continue;
   }
   OutputStream os = new BufferedOutputStream(new FileOutputStream(
     getRealFileName(ZIP_DIR, ze.getName())));
   InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
   int readLen = 0;
   while ((readLen = is.read(buf, 0, 1024)) != -1) {
    os.write(buf, 0, readLen);
   }
   is.close();
   os.close();
  }
  zfile.close();
}

public static File getRealFileName(String baseDir, String absFileName) {
  String[] dirs = absFileName.split("/");
  File ret = new File(baseDir);
  if (dirs.length > 1) {
   for (int i = 0; i < dirs.length - 1; i++) {
    ret = new File(ret, dirs[i]);
   }
   if (!ret.exists())
    ret.mkdirs();
   ret = new File(ret, dirs[dirs.length - 1]);
   return ret;
  }
  return ret;
}

public static void deleteDirFile(String path) {
  File file = new File(path);
  if (file.isDirectory()) { // 如果是目录,先递归删除
   String[] list = file.list();
   for (int i = 0; i < list.length; i++) {
    deleteDirFile(path + "\\" + list[i]); // 先删除目录下的文件
   }
  }
  file.delete();
}

public static String newFolder(String dir) {
  java.io.File myFilePath = new java.io.File(dir);
  if (myFilePath.isDirectory()) {
  } else {
   myFilePath.mkdirs();
  }
  return dir;
}

public static String getFileNames(String path) {

  File file = new File(path); // get file list where the path has
  File[] array = file.listFiles(); // 获得文件列表
  String pdfNames = "";

  for (int i = 0; i < array.length; i++) {
   if (array[i].isFile()) {
    if (array[i].getName().endsWith(".pdf")) { // 获得pdf文件名称
     pdfNames += array[i].getName().substring(0,
       array[i].getName().length() - 4)
       + ",";
    }
   }
  }
  if (pdfNames.length() > 0) {
   pdfNames.substring(0, pdfNames.length() - 1);
  }
  return pdfNames;
}

public static void copyFile(String oldPath, String newPath) {
  try {
   int bytesum = 0;
   int byteread = 0;
   File oldfile = new File(oldPath);
   if (oldfile.exists()) { // 文件存在时
    InputStream inStream = new FileInputStream(oldPath); // 读入原文件
    FileOutputStream fs = new FileOutputStream(newPath);
    byte[] buffer = new byte[1444];
    while ((byteread = inStream.read(buffer)) != -1) {
     bytesum += byteread; // 字节数文件大小
     fs.write(buffer, 0, byteread);
    }
    inStream.close();
   }
  } catch (Exception e) {
   System.out.println("copy file error!");
   e.printStackTrace();
  }
}

public static boolean fileExist(String fileNames, String pdfName) {
  boolean flag = false;
  if (!"".equals(fileNames)) {
   String[] nameArr = fileNames.split(",");
   for (int i = 0; i < nameArr.length; i++) {
    if (pdfName.equals(nameArr[i])) { // 如果文件名相同则执行拷贝操作(拷贝到zip目录准备打包)
     flag = true;
     break;
    }
   }
  }
  return flag;
}

public static void deleteFileAndDir(String path) {
  File file = new File(path);
  File[] array = file.listFiles();
  for (int i = 0; i < array.length; i++) {
   if (array[i].isFile()) {
    array[i].delete();
   } else if (array[i].isDirectory()) {
    deleteDirFile(array[i].getPath());
   }
  }
}

}

java压缩zip文件解决中文乱码问题 java压缩文件成zip实现无乱码 内置类与jar包 立即下载

相关推荐

解决Surface更新后Bitlocker无限循环的问题

在Surface系统更新以后,出现要求输入Bitlocker恢复密钥的问题。已经输入正确密钥以后,依然无法正常进入Windows操作系统,一旦重启依然循环Bitlocker要求输入密钥的界面。 一旦到登录界面,点击“登录”之后又跳转回登录界面.,但就是无法进入桌面。 解决方案: 拒绝暴力重装!这个问题是Bitlock把盘给锁了,所以要解锁 重启之后,直接点击右下角“跳过这个驱动器” 选择“疑难解答”,然后进入命令提示符 先查看判断现在是不是被锁了: 输入: manage-bde -status c

premierapp的博客 1万+

Java解压zip 解决编码和中文乱码问题

项目由GBK转成UTF-8 遇到原有解析zip发现中文文件名称乱码问题 <!--pom包--> <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>1.3.2...

风起未来 6476

HR效率翻倍!用Dify+飞书AI表格打造自动化简历处理流水线(附完整代码)

本文详细介绍了如何利用Dify工作流和飞书多维表格构建自动化简历处理系统,实现简历上传、AI智能解析与结构化数据入库的全流程自动化。通过整合大语言模型进行信息抽取,该系统能显著提升HR处理简历的效率与准确性,将HR从重复劳动中解放出来。

1a2s3d4f5g的博客 1026

Java程序在Linux解压zip,文件名乱码解决

【代码】Java程序在Linux解压zip,文件名乱码解决。

JavaDaBaiCai的博客 1732

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 914

phaser3适配微信小游戏

phaser3适配微信小游戏

SilenzioX的博客 1805

java csv文件放入zip 解压以后乱码

在本机下载解压以后没有问题, 发布到服务器以后解压却变成编码以后的。 ZipOutputStream zipTempFile = null; 后来查了一下 发现可以编码但是引入的包要Apache下的 zipTempFile.setEncoding("gbk");//要引用Apache下面的包 才有shezhiorg.apache.tools.zip.ZipOutputStream; 问

zy_crazy_code的博客 941

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 831

Java中压缩与解压--中文文件名乱码解决办法

http://xxw8393.blog.163.com/blog/static/37256834200993051226320/ java对於文字的编码是以 unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不

铁锹在手,天下我有 1万+

【5】GD32H7xx CAN发送及FIFO接收

GD32H7xx CAN收发调试记录,包含源码

madao1234的博客 1816

手把手教你学Simulink--电机控制架构与算法实现​场景示例:基于Simulink的电机速度环PID调节仿真

本文带你完成了电机速度环PID参数的科学整定,实现了:✅ 理解了速度环的级联系统特性与关键参数影响工程整定法(理论初值)系统辨识法(参数未知时)✅ PID Tuner自动调参(推荐!自动调参兼具快速性与鲁棒性✅ 学会了前馈补偿抗饱和等工程实用技巧。

MHD0815的博客 653

java zip 中文文件名乱码_java使用zip压缩中文文件名乱码的解决办法

java使用zip压缩中文文件名乱码的解决办法发布时间:2020-06-15 15:20:58来源:亿速云阅读:106作者:元一java概述Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复...

weixin_30744725的博客 5307

使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统

智能家居火灾报警系统旨在通过烟雾传感器、温度传感器等设备监测家庭环境,一旦检测到异常情况(如烟雾或温度骤升),立即触发警报并采取相应措施。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居火灾报警系统,包括数据采集、处理以及响应机制。

amy_mhd的博客 162

java 打包乱码_java zip打包与乱码的解决

importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStrea...

weixin_32001191的博客 236

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java linux打包文件夹_使用java在linux中将多个文件打包为zip,并解决中文文件名乱码...

近两天在开发过程中碰到一个需求,需要将服务器上的多个文件打包为ZIP,并进行下载。现将打包核心代码贴出来,以便相互交流:/**** @param srcfile 需要打包为zip的文件集合* @param zipfile 创建的zip文件*/public void zipFiles(List srcfile, File zipfile) {byte[] buf = new...

weixin_39555415的博客 416

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 打包zip路径中文_解决java中ZipFile解压缩时候的中文路径和乱码问题

JAVA中对jar文件或zip文件解压的时候,可以使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,经常报以下错误:Exception in thread "main" java.lang.IllegalArgumentException: MALFORMEDat java.util.zip.ZipCoder.toString(ZipCoder.j...

weixin_29098367的博客 948

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

(java)解决文件是中文名打包成zip文件名称乱码的问题。

1、引人 import org.apache.tools.zip.ZipEntry;  import org.apache.tools.zip.ZipOutputStream;类 2、方法 /* billNos:要打包的文件列表 suffix:后缀名 return 打包文件路径 */ private String packZip(List billNos, String suff

menu 9459

java 生成zip文件并导出

总结一下,关于Java下载zip文件并导出的方法,浏览器导出。      String downloadName = "下载文件名称.zip"; downloadName = BrowserCharCodeUtils.browserCharCodeFun(request, downloadName);//下载文件名乱码问题解决 //将文...

weixin_30483495的博客 606

用Java实现ZIP压缩文件和目录程序代码

由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。 以下是代码:packagenet.szh.zip; importjava.io.BufferedInputStream; importjava.io.File; importjava.io.FileInp...

weixin_33812433的博客 72

Java Zip实现

package com.sofree.common.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.ap

燃烧JAVA 680

Java中字符串生成文件打包为zip下载

Java中字符串生成文件打包为zip下载

qq_45454550的博客 1034

java zip上传_JavaWeb实现多文件上传及zip打包下载

本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下项目中经常会使用到文件上传及下载的功能。本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分。首先明确一点:无法通过页面的无刷新ajax请求,直接发下载、上传请求。上传和下载,均需要在整页请求的基础上实现。项目中一般通过构建form表单形式实现这一功能。一、多文件上传...

weixin_35436993的博客 620

java图片导出为zip

碰到一个需求,要导出一批人员的头像,所以想导出一个压缩包给用户。   代码所需要的包为commons-compress-1.6.jar, 如果用的是maven,maven代码为: &lt;dependency&gt; &lt;groupId&gt;org.apache.commons&lt;/groupId&gt; &lt;arti...

lawliet1217的博客 2491
上一篇: 关于tomcat版本的选择
下一篇: dom4j操作xml时的乱码与格式化
sr2012
博客等级 码龄14年 0粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值