`

java zip打包与乱码的解决

 
阅读更多

关于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());
}
}
}

}

分享到:
评论

相关推荐

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    java zipentry.jar 解决解压失败问题

    ZIP是一种广泛使用的档案格式,它允许将多个文件和目录打包成一个单一的文件,以便于存储和传输。ZIP文件内部通常使用UTF-8编码来存储文件名和路径,但并非所有ZIP工具都遵循这个标准,有的可能使用本地操作系统默认...

    java zip 打包

    `java zip 打包`这个话题聚焦于如何使用Java来创建ZIP归档,以及如何处理中文文件名的乱码问题。Apache Ant的`ant.jar`库提供了强大的构建工具,它包含了一系列用于处理文件打包的实用程序,其中包括对ZIP格式的支持...

    java 打zip包

    本资源提供了一种解决方案,解决了使用Java打zip包时可能会遇到的中文乱码和包含空文件的问题。以下是关于这个主题的一些关键知识点: 1. **Java的 ZIP API**:Java标准库提供了一个名为`java.util.zip`的包,它...

    java zip文件压缩与解压缩

    Java中的zip文件压缩和解压缩是程序开发中常见的任务,特别是在处理大量数据或者打包资源文件时。Apache Commons Compress库是Java中一个强大的工具,它提供了对多种压缩格式的支持,包括zip,而且能够处理中文...

    用java打zip包

    以下将详细讲解如何使用Java结合Ant来创建ZIP文件,并解决中文乱码的问题。 首先,我们需要理解Java中用于创建ZIP文件的API。Java标准库中的`java.util.zip`包提供了`ZipOutputStream`类,可以用来创建ZIP文件。...

    文件解压和压缩 解决中文乱码

    在Java标准库中,我们可以使用`java.util.zip`包中的`ZipInputStream`和`ZipEntry`来实现ZIP文件的解压。例如,你可以创建一个`ZipInputStream`对象,然后通过循环读取每个`ZipEntry`,将其写入目标文件系统。在处理...

    读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码(还是以支付宝对账单为例)

    ZIP是一种广泛使用的文件存档格式,它允许将多个文件和目录打包成一个单一的压缩文件,以节省存储空间和提高传输效率。ZIP文件内部包含了文件的原始数据以及元数据,如文件名、日期时间戳等。 在Java或Python等编程...

    java压缩中文处理使用org.apache.tools.zip已经打包成jar

    java压缩中文处理使用org.apache.tools.zip已经打包成jar 只要放在LIB文件夹下,然后在JSP 或 JAVA 里引用即可。 &lt;%@ page language="java" import="java.sql.*,java.io.*,org.apache.tools.zip.Zip" pageEncoding=...

    Java压缩和解压缩zip文件

    本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先,我们要了解Java中处理ZIP文件的核心类:`java.util.zip.ZipOutputStream` 和 `java.util.zip....

    ZipOutputStream 压缩文件以及乱码问题解决方案

    这段代码会将名为`Test.java`的文件打包成名为`output.zip`的ZIP文件。`addFileToZip`方法递归地处理目录结构,将所有文件添加到ZIP输出流。 接下来,我们讨论乱码问题。当处理非ASCII字符(如中文、日文等)的...

    android解压zip乱码处理(包括ant瘦身后的jar)

    在android开发中,有时候需要将文件打包成zip或将zip解压,如果直接用java.util.zip包下面的类会出现中文乱码,如果直接用org.apache.tools.zip(ant包中的压缩功能)会影响项目的编译时间; 故将ant包中文件瘦身,既...

    java 实现打zip包

    本文将深入探讨如何使用Java处理zip压缩,包括解决中文乱码和打包空文件夹的问题。 首先,Java提供了`java.util.zip`包,它包含了一系列类和接口,如`ZipOutputStream`和`ZipEntry`,可以用来创建和操作zip文件。...

    Java解压zip文件完整代码分享

    在Java编程中,解压ZIP文件是一项常见的任务,特别是在处理数据传输、文件打包或软件部署时。Apache Commons Compress库提供了方便的API来处理各种压缩格式,包括ZIP。以下是一个详细的Java解压ZIP文件的代码示例,...

    java 下载文件 压缩且删除源文件(支持文件夹与文件)

    1、指定文件可下载并且服务器端会删除此文件。 2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件...注意一点:中文的文件名会出现乱码(解决方案:导入ant.jar)

    20 中文乱码解决办法

    14. **ZIP或RAR压缩包**:在打包文件时,保留文件的原始编码信息,解压时使用与之匹配的解压工具。 15. **数据库连接字符串**:在数据库连接字符串中明确指定字符集,如`jdbc:mysql://localhost:3306/test?...

    基于zip4j的压缩工具

    【基于zip4j的压缩工具】是一个用于处理ZIP文件的Java库,它提供了丰富的功能,使得在Java程序中创建、读取、修改和管理ZIP文件变得简单易行。该工具的核心特性包括多文件合并压缩、目录树压缩以及对字符集和密码...

    装界面乱码问题解决方法

    当我们在Linux环境下安装Oracle数据库(如Oracle 11g)时,如果使用的字符集与系统默认字符集不一致或存在兼容性问题,就有可能出现安装界面上的文字显示为乱码的情况。这不仅会影响用户体验,还可能对后续的配置和...

    apache ant zip 包 1.8.0 (含api)

    当Java尝试读取或写入包含非ASCII字符的ZIP文件时,如果没有正确处理编码,就会出现乱码或者解压失败的情况。 Apache Ant 提供了更高级的控制来解决这个问题。例如,你可以使用`zip`任务的`encoding`属性指定ZIP...

    在C#中调用 java的函数(C#与java结合使用)的ikvm相关包

    b:建立一个JavaProject,自定义包、类、需要透露给外界的方法,然后、将这个JavaProject打包成jar文件。(eclipse和myeclipse都自带的,或者你可以显摆一下,用黑框框敲几个代码整)。 c:狸猫换太子:jar&gt;&gt;dll ...

Global site tag (gtag.js) - Google Analytics