1. ホーム
  2. Java

org.apache.tools.zip を使用した Zip 圧縮・解凍

2022-02-19 11:21:56
<スパン インポート  java.io.*; 



インポート  org.apache.tools.zip.*; 



インポート  java.util.Enumeration。 



/** 



* 機能:zip圧縮、解凍(中国語ファイル名対応) 



*説明:このプログラムは、Apache Antで提供されるzipツール org.apache.tools.zipを用いてzip圧縮・解凍を実装しています。 



* java.util.zipパッケージが漢字に対応していないことによる不具合を解消しました。 



* java.util.zip パッケージを使用した場合、zip ファイル内に中国語名のファイルがある場合。 



* スレッドで例外発生 "main " java.lang.IllegalArgumentException  



* at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285) 



*注 



* 1.使用する際は、クラスパスに ant.jar を入れ、プログラム内で import org.apache.tools.zip.* を使用します。 



* 2、Apache Antのダウンロードアドレス:[url]http://ant.apache.org/[/url] 



* 3.AntのZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url] 



* 4.このプログラムは、Ant 1.7.1のant.jarを使用しています。 




* プログラミングの学習用としてのみ使用できます。 




*作者:Winty 



*日付 2008年8月3日 



*@Usage: 



*圧縮:java AntZip -zip "ディレクトリ名"。 



* 解凍:java AntZip -unzip "fileName.zip"。 



*/








公開 クラス  AntZip{ 



プライベート  ZipFile zipFile; 



プライベート  ZipOutputStream zipOut;      //Zip圧縮 



プライベート  ZipEntry zipEntry; 



プライベート 静的 int       bufSize;     //バイトの大きさ 



プライベート バイト [] buf; 



プライベート int              readedBytesです。 







公開  AntZip(){ 



これ (512); 



    } 







公開  AntZip( int  bufSize){ 



これ .bufSize = bufSize; 



これ .buf =  新しい バイト [ これ .bufSize]を参照してください。 



    } 







// フォルダ内のファイルを圧縮する 



公開 ボイド  doZip(String zipDirectory){ <未定義 //zipDirectoryPath:圧縮されるフォルダー名 



        ファイルのファイルです。 



        ファイル zipDir。 







        zipDir =  新しい  ファイル(zipDirectory)。 



        文字列 zipFileName = zipDir.getName() +.  ".zip" ; //圧縮後に生成されるzipファイルの名前 







試みる



これ .zipOut =  新規  ZipOutputStream( 新しい  バッファードアウトプットストリーム( 新しい  FileOutputStream(zipFileName)))。 



            handleDir(zipDir ,  これ .zipOut)。 



これ .zipOut.close()を実行します。 



        } キャッチ (IOExceptionのioe){。 



            ioe.printStackTrace()を実行します。 



        } 



    } 







// doZip によって呼び出され、ディレクトリファイルの読み込みを再帰的に完了させる 



プライベート ボイド  handleDir(File dir , ZipOutputStream zipOut) スロー  IOException{ 



        FileInputStream fileIn; 



        ファイル[]ファイル 







        files = dir.listFiles(); 







もし (files.length == 0){ <未定義 //ディレクトリが空の場合、別途作成する。 



//ZipEntry の isDirectory() メソッドでは、ディレクトリの末尾が "/" になっています。 



<スパン これは
.zipOut.putNextEntry()。 新しい  ZipEntry(dir.toString() +)  "/" )); 



これ .zipOut.closeEntry()を実行します。 



        } 



さもなくば { <未定義 // ディレクトリが空でない場合、ディレクトリとファイルを別々に処理する。 



について (ファイル fileName : files){. 



//System.out.println(fileName); 







もし (fileName.isDirectory()){。 



                    handleDir(fileName ,  この .zipOut)。 



                } 



さもなくば



                    ファイルイン =  新しい  FileInputStream(fileName)。 



これ .zipOut.putNextEntry() 新しい  ZipEntry(fileName.toString())); 







をしながら (( これ .readedBytes = fileIn.read() これ .buf))>0){。 



これ .zipOut.write( これ .buf , 0 ,  これ .readedBytes)。 



                    } 







これ .zipOut.closeEntry()を実行します。 



                } 



            } 



        } 



    } 







//指定されたzipファイルを解凍する 



公開 ボイド  unZip(StringのunZipfileName){。 <未定義 //unZipfileName 解凍する zip ファイルの名前です。 



        FileOutputStream fileOut; 



        ファイル file; 



        InputStream inputStream; 







試みる



これ .zipFile =  新規  ZipFile(unZipfileName)を使用します。 







について (列挙項目 =  これ .zipFile.getEntries(); entries.hasMoreElements(); ){。 



                ZipEntry entry = (ZipEntry)entries.nextElement(); 



                ファイル =  新しい  ファイル(entry.getName())。 







もし (entry.isDirectory()){。 



                    file.mkdirs()を実行します。 



                } 



さもなくば



// 指定されたファイルのディレクトリが存在しない場合、作成する。 



                    ファイル parent = file.getParentFile(); 



もし (!parent.exists()){ 



                        parent.mkdirs()を実行します。 



                    } 







                    inputStream = zipFile.getInputStream(entry)。 







                    fileOut =  新しい  FileOutputStream(file)。 



をしながら ((  これ .readedBytes = inputStream.read()。 これ .buf) ) > 0){。 



                        fileOut.write( これ .buf , 0 ,  これ .readedBytes )。 



                    } 



                    fileOut.close()を実行します。 







                    inputStream.close()を実行します。 



                }    



            } 



これ .zipFile.close()を実行します。 



        } キャッチ (IOExceptionのioe){。 



            ioe.printStackTrace()を実行します。 



        } 



    } 







// バッファサイズを設定する 



公開 ボイド  setBufSize( int  bufSize){ 



これ .bufSize = bufSize; 



    } 







// AntZip クラスのテスト 



公開 静的 ボイド  main(String[] args) 投げる  Exception{ 



もし (args.length==2){。 



            文字列名 = args[1]; 



            AntZip zip =  新しい  AntZip()を使用します。 







もし (args[0].equals()の場合 zip" )) 



                zip.doZip(名前); 



さもなくば もし (args[0].equals()の場合 解凍してください。 )) 



                zip.unZip(name)を実行します。 



        } 



さもなくば



            System.out.println( 使用方法:"使用方法:" ); 



            System.out.println( "zip:java AntZip -zip directoryName" ); 



            System.out.println( "解凍:java AntZip -unzip fileName.zip" ); 



投げる 新しい  例外( 引数エラー!"引数エラー!" ); 



        } 



    } 



}