最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • java中解压乱码解决方法_Java教程


    第一种使用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;
     
    /**
     *<p>
     * <b>功能:zip压缩、解压(支持中文文件名)</b>
     *<p>
     * 说明:使用Apache Ant提供的zip工具org.apache.tools.zip实现zip压缩和解压功能.
     * 解决了由于java.util.zip包不支持汉字的问题。
     * 
     * @author Winty
     * @modifier vernon.zheng
     */
    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;
     
    	/**
    	 *构造方法。默认缓冲区大小为512字节。
    	 */
    	public AntZip() {
    		this(512);
    	}
     
    	/**
    	 *构造方法。
    	 * 
    	 * @param bufSize
    	 *            指定压缩或解压时的缓冲区大小
    	 */
    	public AntZip(int bufSize) {
    		this.bufSize = bufSize;
    		this.buf = new byte[this.bufSize];
    		deleteAbsoluteParent = null;
    	}
     
    	/**
    	 *压缩文件夹内的所有文件和目录。
    	 * 
    	 * @param zipDirectory
    	 *            需要压缩的文件夹名
    	 */
    	public void doZip(String zipDirectory) {
    		File zipDir = new File(zipDirectory);
    		doZip(new File[] { zipDir }, zipDir.getName());
    	}
     
    	/**
    	 *压缩多个文件或目录。可以指定多个单独的文件或目录。而 <code>doZip(String zipDirectory)</code>
    	 * 则直接压缩整个文件夹。
    	 * 
    	 * @param files
    	 *            要压缩的文件或目录组成的<code>File</code>数组。
    	 [email protected] zipFileName
    	 *            压缩后的zip文件名,如果后缀不是".zip", 自动添加后缀".zip"。
    	 */
    	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();
    		}
    	}
     
    	/**
    	 *压缩文件和目录。由doZip()调用
    	 * 
    	 * @param files
    	 *            要压缩的文件
    	 [email protected] zipOut
    	 *            zip输出流
    	 [email protected] isAbsolute
    	 *            是否是要去除的绝对路径的根路径。因为compressFiles()
    	 *            会递归地被调用,所以只用deleteAbsoluteParent不行。必须用isAbsolute来指明
    	 *            compressFiles()是第一次调用,而不是后续的递归调用。即如果要压缩的路径是
    	 *            E:\temp,那么第一次调用时,isAbsolute=true,则deleteAbsoluteParent会记录
    	 *            要删除的路径就是E:\ ,当压缩子目录E:\temp\folder时,isAbsolute=false,
    	 *            再递归调用compressFiles()时,deleteAbsoluteParent仍然是E:\ 。从而保证了
    	 *            将E:\temp及其子目录均正确地转化为相对目录。这样压缩才不会出错。不然绝对 路径E:\也会被写入到压缩文件中去。
    	 */
    	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);
    			}
    		}
    	}
     
    	/**
    	 *压缩文件或空目录。由compressFiles()调用。
    	 * 
    	 * @param file
    	 *            需要压缩的文件
    	 [email protected] zipOut
    	 *            zip输出流
    	 */
    	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;
     
    		/*
    		 * 因为是空目录,所以要在结尾加一个"/"。 不然就会被当作是空文件。 ZipEntry的isDirectory()方法中,目录以"/"结尾.
    		 * org.apache.tools.zip.ZipEntry : public boolean isDirectory() { return
    		 * getName().endsWith("/"); }
    		 */
    		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();
    	}
     
    	/**
    	 *递归完成目录文件读取。由compressFiles()调用。
    	 * 
    	 * @param dir
    	 *            需要处理的文件对象
    	 [email protected] zipOut
    	 *            zip输出流
    	 */
    	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);
    	}
     
    	/**
    	 *解压指定zip文件。
    	 * 
    	 * @param unZipFileName
    	 *            需要解压的zip文件名
    	 */
    	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();
    		}
    	}
    	/**
    	 *解压指定zip文件。其中"GB18030"解决中文乱码
    	 * 
    	 * @param unZipFileName
    	 *            需要解压的zip文件名
    	 * @param outputPath
    	 *            输出路径
    	 */
    	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();
    		}
    	}
     
    	/**
    	 *给文件路径或目录结尾添加File.separator
    	 * 
    	 * @param fileName
    	 *            需要添加路径分割符的路径
    	 [email protected] 如果路径已经有分割符,则原样返回,否则添加分割符后返回。
    	 */
    	private String appendSeparator(String path) {
    		if (!path.endsWith(File.separator))
    			path += File.separator;
    		return path;
    	}
     
    	/**
    	 *解压指定zip文件。
    	 * 
    	 * @param unZipFile
    	 *            需要解压的zip文件对象
    	 */
    	public void unZip(File unZipFile) {
    		unZip(unZipFile.toString());
    	}
     
    	/**
    	 *设置压缩或解压时缓冲区大小。
    	 * 
    	 * @param bufSize
    	 *            缓冲区大小
    	 */
    	public void setBufSize(int bufSize) {
    		this.bufSize = bufSize;
    	}
    	// 主函数,用于测试AntZip类
    	/*
    	 * public static void main(String[] args)throws Exception{
    	 * if(args.length>=2){ AntZip zip = new AntZip();
    	 * 
    	 * if(args[0].equals("-zip")){ //将后续参数全部转化为File对象 File[] files = new File[
    	 * args.length - 1]; for(int i = 0;i < args.length - 1; i++){ files = new
    	 * File(args[i + 1]); }
    	 * 
    	 * //将第一个文件名作为zip文件名 zip.doZip(files , files[0].getName());
    	 * 
    	 * return ; } else if(args[0].equals("-unzip")){ zip.unZip(args[1]); return
    	 * ; } }
    	 * 
    	 * System.out.println("Usage:");
    	 * System.out.println("压缩:java AntZip -zip [directoryName | fileName]... ");
    	 * System.out.println("解压:java AntZip -unzip fileName.zip"); }
    	 */
     
    }

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

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

    一、ZipOutputStream.java

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

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

    3.建构式也必须更改为CZipOutputStream

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

    private String encoding="UTF-8";

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

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

    推荐:java基础教程

    以上就是java中解压乱码解决方法的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1185会员总数(位)
    • 111860资源总数(个)
    • 4本周发布(个)
    • 0 今日发布(个)
    • 248稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    [email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐