日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java解压_Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)

發布時間:2024/9/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java解压_Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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編碼格式設置為系統文件名編碼方式,否則解壓時報異常.

(網上,還有修改ZipInputStream源碼的方式貌似太麻煩了,參考:http://zwllxs.iteye.com/blog/871260)

ZIP代碼參考http://szhnet.iteye.com/blog/199059,有修改.

package io;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.zip.CRC32;

import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipOutputStream;

public class Zip

{

static final int BUFFER = 8192;

public Zip()

{

}

private static void compress(File file, ZipOutputStream out, String basedir)

{

/* 判斷是目錄還是文件 */

if (file.isDirectory())

{

// System.out.println("壓縮:" + basedir + file.getName());

compressDirectory(file, out, basedir);

}

else

{

// System.out.println("壓縮:" + basedir + file.getName());

compressFile(file, out, basedir);

}

}

/** 壓縮一個目錄 */

private static void compressDirectory(File dir, ZipOutputStream out, String basedir)

{

if (!dir.exists()) return;

File[] files = dir.listFiles();

for (int i = 0; i < files.length; i++)

{

/* 遞歸 */

compress(files[i], out, basedir + dir.getName() + "/");

}

}

/** 壓縮一個文件 */

private static void compressFile(File file, ZipOutputStream out, String basedir)

{

if (!file.exists())

{

return;

}

try

{

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

ZipEntry entry = new ZipEntry(basedir + file.getName());

out.putNextEntry(entry);

int count;

byte data[] = new byte[BUFFER];

while ((count = bis.read(data, 0, BUFFER)) != -1)

{

out.write(data, 0, count);

}

bis.close();

}

catch (Exception e)

{

throw new RuntimeException(e);

}

}

public static void zip(String srcPathName, String zipFileName)

{

File file = new File(srcPathName);

File zipFile = new File(zipFileName);

if (!file.exists()) throw new RuntimeException(srcPathName + "不存在!");

try

{

FileOutputStream fileOutputStream = new FileOutputStream(zipFile);

CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());

ZipOutputStream out = new ZipOutputStream(cos);

out.setEncoding(System.getProperty("sun.jnu.encoding"));//設置文件名編碼方式

String basedir = "";

compress(file, out, basedir);

out.close();

}

catch (Exception e)

{

throw new RuntimeException(e);

}

}

public static void main(String[] args)

{

Zip.zip("D:\\D\\dll", "D:\\D\\dll.zip");

}

}

UnZip代碼:

package io;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.zip.ZipEntry;

import java.util.zip.ZipInputStream;

public class UnZip

{

public static void unzip(String zipFilePath, String destDir)

{

System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); //防止文件名中有中文時出錯

//System.out.println(System.getProperty("sun.zip.encoding")); //ZIP編碼方式

//System.out.println(System.getProperty("sun.jnu.encoding")); //當前文件編碼方式

//System.out.println(System.getProperty("file.encoding")); //這個是當前文件內容編碼方式

File dir = new File(destDir);

// create output directory if it doesn't exist

if (!dir.exists()) dir.mkdirs();

FileInputStream fis;

// buffer for read and write data to file

byte[] buffer = new byte[1024];

try

{

fis = new FileInputStream(zipFilePath);

ZipInputStream zis = new ZipInputStream(fis);

ZipEntry ze = zis.getNextEntry();

while (ze != null)

{

String fileName = ze.getName();

File newFile = new File(destDir + File.separator + fileName);

//System.out.println("Unzipping to " + newFile.getAbsolutePath());

// create directories for sub directories in zip

new File(newFile.getParent()).mkdirs();

FileOutputStream fos = new FileOutputStream(newFile);

int len;

while ((len = zis.read(buffer)) > 0)

{

fos.write(buffer, 0, len);

}

fos.close();

// close this ZipEntry

zis.closeEntry();

ze = zis.getNextEntry();

}

// close last ZipEntry

zis.closeEntry();

zis.close();

fis.close();

}

catch (IOException e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

String zipFilePath = "D:\\D\\dll.zip";

String destDir = "D:\\D\\dll_zip";

UnZip.unzip(zipFilePath, destDir);

}

}

總結

以上是生活随笔為你收集整理的java解压_Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。