返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中解压乱码解决方法
  • 411
分享到

java中解压乱码解决方法

java 2020-06-12 13:06:03 411人浏览 绘本
摘要

第一种使用ant实现的zip解压缩,其中解压的乱码注意使用public void unZip(String unZipFileName,String outputPath) 其中this.zipFile = new ZipFile(unZi

第一种使用ant实现的zip解压缩,其中解压的乱码注意使用

public void unZip(String unZipFileName,String outputPath) 其中

this.zipFile = new ZipFile(unZipFileName, "GB18030");是解决中文名乱码的关键。

import java.io.*;
import org.apache.tools.zip.*;
import java.util.Enumeration;
 

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;
	// 用于压缩中。要去除的绝对父路路径,目的是将绝对路径变成相对路径。
	private String deleteAbsoluteParent;
 
	
	public AntZip() {
		this(512);
	}
 
	
	public AntZip(int bufSize) {
		this.bufSize = bufSize;
		this.buf = new byte[this.bufSize];
		deleteAbsoluteParent = null;
	}
 
	
	public void doZip(String zipDirectory) {
		File zipDir = new File(zipDirectory);
		doZip(new File[] { zipDir }, zipDir.getName());
	}
 
	
	public void doZip(File[] files, String zipFileName) {
		// 未指定压缩文件名,默认为"ZipFile"
		if (zipFileName == null || zipFileName.equals(""))
			zipFileName = "ZipFile";
 
		// 添加".zip"后缀
		if (!zipFileName.endsWith(".zip"))
			zipFileName += ".zip";
 
		try {
			this.zipOut = new ZipOutputStream(new BufferedOutputStream(
					new FileOutputStream(zipFileName)));
			compressFiles(files, this.zipOut, true);
			this.zipOut.close();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
 
	
	private void compressFiles(File[] files, ZipOutputStream zipOut,
			boolean isAbsolute) throws IOException {
 
		for (File file : files) {
			if (file == null)
				continue; // 空的文件对象
 
			// 删除绝对父路径
			if (file.isAbsolute()) {
				if (isAbsolute) {
					deleteAbsoluteParent = file.getParentFile()
							.getAbsolutePath();
					deleteAbsoluteParent = appendSeparator(deleteAbsoluteParent);
				}
			} else
				deleteAbsoluteParent = "";
 
			if (file.isDirectory()) {// 是目录
				compressFolder(file, zipOut);
			} else {// 是文件
				compressFile(file, zipOut);
			}
		}
	}
 
	
	public void compressFile(File file, ZipOutputStream zipOut)
			throws IOException {
 
		String fileName = file.toString();
 
		
		if (file.isAbsolute())
			fileName = fileName.substring(deleteAbsoluteParent.length());
		if (fileName == null || fileName == "")
			return;
 
		
		if (file.isDirectory())
			fileName = fileName + "/";// 此处不能用"\"
 
		zipOut.putNextEntry(new ZipEntry(fileName));
 
		// 如果是文件则需读;如果是空目录则无需读,直接转到zipOut.closeEntry()。
		if (file.isFile()) {
			FileInputStream fileIn = new FileInputStream(file);
			while ((this.readedBytes = fileIn.read(this.buf)) > 0) {
				zipOut.write(this.buf, 0, this.readedBytes);
			}
			fileIn.close();
		}
 
		zipOut.closeEntry();
	}
 
	
	private void compressFolder(File dir, ZipOutputStream zipOut)
			throws IOException {
 
		File[] files = dir.listFiles();
 
		if (files.length == 0)// 如果目录为空,则单独压缩空目录。
			compressFile(dir, zipOut);
		else
			// 如果目录不为空,则分别处理目录和文件.
			compressFiles(files, zipOut, false);
	}
 
	
	public void unZip(String unZipFileName) {
		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 != null && !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 unZip(String unZipFileName,String outputPath) {
		FileOutputStream fileOut;
		File file;
		InputStream inputStream;
 
		try {
			this.zipFile = new ZipFile(unZipFileName, "GB18030");
 
			for (Enumeration entries = this.zipFile.getEntries(); entries
					.hasMoreElements();) {
 
				ZipEntry entry = (ZipEntry) entries.nextElement();
				file = new File(outputPath+entry.getName());
 
				if (entry.isDirectory()) {// 是目录,则创建之
					file.mkdirs();
				} else {// 是文件
					// 如果指定文件的父目录不存在,则创建之.
					File parent = file.getParentFile();
					if (parent != null && !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();
		}
	}
 
	
	private String appendSeparator(String path) {
		if (!path.endsWith(File.separator))
			path += File.separator;
		return path;
	}
 
	
	public void unZip(File unZipFile) {
		unZip(unZipFile.toString());
	}
 
	
	public void setBufSize(int bufSize) {
		this.bufSize = bufSize;
	}
	// 主函数,用于测试AntZip类
	
 
}

第二种 从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。

我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改:

一、ZipOutputStream.java

从jdk的src.zip取得ZipOutputStream.java原始码,另存新档存到c:/java/util/zip这个资料夹里,档名改为CZipOutputStream.java。

开始修改原始码,将class名称改为CZipOutputStream

建构式也必须更改为CZipOutputStream

新增member,这个member记录编码方式

private String encoding="UTF-8";

再新增一个建构式(这个建构式可以让这个class在new的时候,设定档名的编码)

 public CZipOutputStream(OutputStream out,String encoding) { 
     super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); 
     usesDefaultDeflater = true; 
     this.encoding=encoding; 
  }

推荐:Java基础教程

--结束END--

本文标题: java中解压乱码解决方法

本文链接: https://lsjlt.com/news/1699.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java中解压乱码解决方法
    第一种使用ant实现的zip解压缩,其中解压的乱码注意使用public void unZip(String unZipFileName,String outputPath) 其中this.zipFile = new ZipFile(unZi...
    99+
    2020-06-12
    java
  • java中zip压缩乱码解决方法(附代码)
    用java来打包文件生成压缩文件,有两个地方会出现乱码(推荐:java基础教程)内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码;使用开源的类库org.apache.tools.zip.ZipOutputStre...
    99+
    2020-12-29
    java
  • java文件压缩乱码解决方法
    一、文件压缩的中文乱码问题中文文件名的乱码解决对于压缩的文件,当文件名称是中文时,若使用JDK API中自带的类(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)进行压缩,压缩完...
    99+
    2021-05-16
    java 乱码
  • php解压zip乱码的解决方法
    这篇文章给大家分享的是有关php解压zip乱码的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php解压zip乱码的解决办法:首先打开相应的PHP文件;然后用PHP的zip封装协议解压去解决ZipArch...
    99+
    2023-06-14
  • java中string乱码解决方法
    java中string乱码解决方法:(推荐:java视频教程)对字符串进行转码来解决字符串乱码代码如下:System.out.println(str); String str1 = new String(str.ge...
    99+
    2021-08-15
    java
  • java中url乱码解决方法
    java中url乱码解决方法:(推荐:java视频教程)将字符串转码:newString(“xxxxx”.getBytes(“iso-8859-1”),”utf-8”)这种转码方式有很大的弊端,因为它是使用指定的字符集将此String编码为...
    99+
    2017-05-02
    java
  • java中request乱码解决方法
    POST中文乱码解决方式:POST通过request body传递参数。设置response的字符流的编码方式为UTF-8。request.setCharacterEncoding("UTF-8"); 这句话解决了POST方式提交的中文乱码...
    99+
    2019-08-18
    java request 乱码
  • python解决Fedora解压zip时中文乱码的方法
    前言 很多时候在windows下压缩文件没问题,但是到了Linux下,出现乱码,很常见。以前在Ubuntu下,用`unzip -O GBK filename.zip` 就可以搞定。 换了Fedora后,暂时...
    99+
    2022-06-04
    乱码 中文 方法
  • java中请求乱码解决方法
    出现的问题:通过get请求向服务器发送请求时,如果请求参数为中文时,服务器端接受到的参数为乱码。乱码原因分析及解决办法:关于解码和编码编码:'中'→1110001解码:1110001→'中'乱码:编码和解码过程中使用了不同的字符集Web应用...
    99+
    2020-03-30
    java
  • java web乱码解决方法
    设置文件的保存编码格式,这个一般在新建项目时,设置了GBK的编码格式,这时文件的页面编码格式是GBK的,而保存格式是ANSI的,后来把项目及文件的编码格式改为utf-8的编码格式后,依然出现中文乱码,这就是因为已经存在的文件的保存编码格式还...
    99+
    2014-05-26
    java 乱码
  • java zip压缩乱码原因与解决方法介绍
    java zip压缩乱码的原因与解决方法:(推荐:java视频教程)运行环境Jdk 1.5,win 7中文版JDK1.5中有zip压缩相关的API,在java.util.zip包下面。正常情况下,使用JDK自带的API把目录(文件)压缩成z...
    99+
    2015-12-05
    java
  • java中解决中文乱码的方法
    java中解决中文乱码的方法:POST请求中文乱码处理(在获得参数值之前设置)req.setCharacterEncoding("UTF-8");GET请求处理中文乱码 //String username = req.getParamete...
    99+
    2019-04-07
    java 乱码
  • java中string乱码解决方法介绍
    java string乱码解决方法:(推荐:java视频教程)System.out.println(str); String str1 = new String(str.getBytes("ISO-8859-1"),...
    99+
    2017-05-07
    java 乱码
  • java中excel导出乱码解决方法
    错误方式:response.setHeader("Content-Disposition", "inline;filename="+ new String(fileName.getBytes(),"utf-8")); String file...
    99+
    2016-02-24
    java 乱码
  • java页面中文乱码解决方法
    设置eclips , window->Preferences->web->JSP Files中的Encoding选项为UTF-8修改jsp文件头部为UTF-8设置servlet中request对象编码public class Registe...
    99+
    2015-12-27
    java 乱码
  • java写xml中文乱码解决方法
    用java写xml文件,发现写完后xml文件的中文就变成了乱码。解决办法:把xml文件的头部编码改为utf-8,StreamResult编码方式也改为utf-8,StreamResult类充当转换结果的持有者,可以为 XML、纯文本、HTM...
    99+
    2019-06-19
    java 乱码
  • java读取中文乱码解决方法
    Java读取文本文件(例如csv文件、txt文件等),遇到中文就变成乱码。读取代码如下:List lines=new ArrayList(); BufferedReader br = new BufferedReader(new F...
    99+
    2018-10-05
    java 乱码
  • java页面乱码解决方法
    在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置(推荐:java视频教程)以tomcat6.0.32为例,需将以下代码:Xml代码 改为:Xml代码 如果tomcat前端有Apache或是Ng...
    99+
    2021-02-14
    java
  • java读oracle乱码解决方法
    当Java读Oracle遇到中文乱码时,我们就需要进行转码。(推荐:java视频教程)转码方法:纯手工转码将读到的字符串s进行转码,如:new String(s.getByte(A), B)Druiddruid是阿里巴巴自己开发的一个驱动,...
    99+
    2015-08-19
    java 乱码
  • java网页乱码解决方法
    java网页乱码常见地方如下:jsp页面中。EL表达式或者直接取值,哪怕写个固定的中文显示都会乱。java代码。前端到后端传输值,乱码。jsp页面编码。只要写jsp的都不陌生,更改页面的字符集。java后台代码。如果是java web项目,...
    99+
    2021-08-10
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作