第一種使用ant實(shí)現(xiàn)的zip解壓縮,其中解壓的亂碼注意使用
public void unZip(String unZipFileName,String outputPath) 其中
this.zipFile = new ZipFile(unZipFileName, "GB18030");是解決中文名亂碼的關(guān)鍵。
import java.io.*; import org.apache.tools.zip.*; import java.util.Enumeration; /** *<p> * <b>功能:zip壓縮、解壓(支持中文文件名)</b> *<p> * 說明:使用Apache Ant提供的zip工具org.apache.tools.zip實(shí)現(xiàn)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; // 用于壓縮中。要去除的絕對(duì)父路路徑,目的是將絕對(duì)路徑變成相對(duì)路徑。 private String deleteAbsoluteParent; /** *構(gòu)造方法。默認(rèn)緩沖區(qū)大小為512字節(jié)。 */ public AntZip() { this(512); } /** *構(gòu)造方法。 * * @param bufSize * 指定壓縮或解壓時(shí)的緩沖區(qū)大小 */ public AntZip(int bufSize) { this.bufSize = bufSize; this.buf = new byte[this.bufSize]; deleteAbsoluteParent = null; } /** *壓縮文件夾內(nèi)的所有文件和目錄。 * * @param zipDirectory * 需要壓縮的文件夾名 */ public void doZip(String zipDirectory) { File zipDir = new File(zipDirectory); doZip(new File[] { zipDir }, zipDir.getName()); } /** *壓縮多個(gè)文件或目錄??梢灾付ǘ鄠€(gè)單獨(dú)的文件或目錄。而 <code>doZip(String zipDirectory)</code> * 則直接壓縮整個(gè)文件夾。 * * @param files * 要壓縮的文件或目錄組成的<code>File</code>數(shù)組。 *@param zipFileName * 壓縮后的zip文件名,如果后綴不是".zip", 自動(dòng)添加后綴".zip"。 */ public void doZip(File[] files, String zipFileName) { // 未指定壓縮文件名,默認(rèn)為"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()調(diào)用 * * @param files * 要壓縮的文件 *@param zipOut * zip輸出流 *@param isAbsolute * 是否是要去除的絕對(duì)路徑的根路徑。因?yàn)閏ompressFiles() * 會(huì)遞歸地被調(diào)用,所以只用deleteAbsoluteParent不行。必須用isAbsolute來指明 * compressFiles()是第一次調(diào)用,而不是后續(xù)的遞歸調(diào)用。即如果要壓縮的路徑是 * E:\temp,那么第一次調(diào)用時(shí),isAbsolute=true,則deleteAbsoluteParent會(huì)記錄 * 要?jiǎng)h除的路徑就是E:\ ,當(dāng)壓縮子目錄E:\temp\folder時(shí),isAbsolute=false, * 再遞歸調(diào)用compressFiles()時(shí),deleteAbsoluteParent仍然是E:\ 。從而保證了 * 將E:\temp及其子目錄均正確地轉(zhuǎn)化為相對(duì)目錄。這樣壓縮才不會(huì)出錯(cuò)。不然絕對(duì) 路徑E:\也會(huì)被寫入到壓縮文件中去。 */ private void compressFiles(File[] files, ZipOutputStream zipOut, boolean isAbsolute) throws IOException { for (File file : files) { if (file == null) continue; // 空的文件對(duì)象 // 刪除絕對(duì)父路徑 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()調(diào)用。 * * @param file * 需要壓縮的文件 *@param zipOut * zip輸出流 */ public void compressFile(File file, ZipOutputStream zipOut) throws IOException { String fileName = file.toString(); /* 去除絕對(duì)父路徑。 */ if (file.isAbsolute()) fileName = fileName.substring(deleteAbsoluteParent.length()); if (fileName == null || fileName == "") return; /* * 因?yàn)槭强漳夸?,所以要在結(jié)尾加一個(gè)"/"。 不然就會(huì)被當(dāng)作是空文件。 ZipEntry的isDirectory()方法中,目錄以"/"結(jié)尾. * org.apache.tools.zip.ZipEntry : public boolean isDirectory() { return * getName().endsWith("/"); } */ if (file.isDirectory()) fileName = fileName + "/";// 此處不能用"\\" zipOut.putNextEntry(new ZipEntry(fileName)); // 如果是文件則需讀;如果是空目錄則無需讀,直接轉(zhuǎn)到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()調(diào)用。 * * @param dir * 需要處理的文件對(duì)象 *@param zipOut * zip輸出流 */ private void compressFolder(File dir, ZipOutputStream zipOut) throws IOException { File[] files = dir.listFiles(); if (files.length == 0)// 如果目錄為空,則單獨(dú)壓縮空目錄。 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()) {// 是目錄,則創(chuàng)建之 file.mkdirs(); } else {// 是文件 // 如果指定文件的父目錄不存在,則創(chuàng)建之. 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()) {// 是目錄,則創(chuàng)建之 file.mkdirs(); } else {// 是文件 // 如果指定文件的父目錄不存在,則創(chuàng)建之. 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(); } } /** *給文件路徑或目錄結(jié)尾添加File.separator * * @param fileName * 需要添加路徑分割符的路徑 *@return 如果路徑已經(jīng)有分割符,則原樣返回,否則添加分割符后返回。 */ private String appendSeparator(String path) { if (!path.endsWith(File.separator)) path += File.separator; return path; } /** *解壓指定zip文件。 * * @param unZipFile * 需要解壓的zip文件對(duì)象 */ public void unZip(File unZipFile) { unZip(unZipFile.toString()); } /** *設(shè)置壓縮或解壓時(shí)緩沖區(qū)大小。 * * @param bufSize * 緩沖區(qū)大小 */ public void setBufSize(int bufSize) { this.bufSize = bufSize; } // 主函數(shù),用于測(cè)試AntZip類 /* * public static void main(String[] args)throws Exception{ * if(args.length>=2){ AntZip zip = new AntZip(); * * if(args[0].equals("-zip")){ //將后續(xù)參數(shù)全部轉(zhuǎn)化為File對(duì)象 File[] files = new File[ * args.length - 1]; for(int i = 0;i < args.length - 1; i++){ files = new * File(args[i + 1]); } * * //將第一個(gè)文件名作為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對(duì)於檔名的編碼方式來著手了。
我們可以從jdk的src.zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改:
一、ZipOutputStream.java
1.從jdk的src.zip取得ZipOutputStream.java原始碼,另存新檔存到c:/java/util/zip這個(gè)資料夾里,檔名改為CZipOutputStream.java。
2.開始修改原始碼,將class名稱改為CZipOutputStream
3.建構(gòu)式也必須更改為CZipOutputStream
4.新增member,這個(gè)member記錄編碼方式
private String encoding="UTF-8";
5.再新增一個(gè)建構(gòu)式(這個(gè)建構(gòu)式可以讓這個(gè)class在new的時(shí)候,設(shè)定檔名的編碼)
public CZipOutputStream(OutputStream out,String encoding) { super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); usesDefaultDeflater = true; this.encoding=encoding; }
Atas ialah kandungan terperinci java中解壓亂碼解決方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.
