JDKが提供するZIPはUTF-8形式でのみ処理でき、Windowsシステムのファイル名がGBKでエンコードされるため、指定されたフォルダーにファイルを減圧する機能を実装するためにJavaに付属の圧縮ツールキットを使用している場合したがって、中国語のファイル名を含むzipパッケージを解凍する場合、違法なパラメーターの例外を報告する場合、減圧を実装する必要があります。 Java、およびZipoutputStream.java。
J2SE 1.4以来、Javaコンパイラは、名前のないパッケージ名のインポートまたはインターフェイスをサポートしていないため、作成したJavaプロジェクトでは、パッケージの命名の形式を逆に作成する必要があります。 cn.edu.xidian.crytollなど、学校ドメイン名 +独自のネットワーク名。
パッケージに新しいdeflaterOutputStreamクラスを作成すると、コードは次のとおりです。
deflateroutputStream.java:
コードコピーは次のとおりです。
パッケージcn.edu.xdian.crytoll;
java.io.filteroutputStreamをインポートします。
java.io.ioexceptionをインポートします。
java.io.outputStreamをインポートします。
java.util.zip.deflaterをインポートします。
/**
*このクラスは、データを圧縮するための出力ストリームフィルターを実装しています
*「デフレート」圧縮形式も使用されます
* gzipoutputStreamなどの圧縮フィルターの種類。
*
* @see deflater
* @version 1.36、03/13/06
* @authorデビッドコネリー
*/
公共
class deflaterOutputStreamはfilteroutputStreamを拡張します{
/**
*このストリームのコンプレッサー。
*/
保護されたdeflater def;
/**
*圧縮データを書き込むための出力バッファー。
*/
保護されたbyte [] buf;
/**
*ストリームが閉じられていることを示します。
*/
プライベートブールクローズ= false;
/**
*指定されたコンプレッサーを使用して新しい出力ストリームを作成し、
*バッファサイズ。
* @param出力ストリームを出します
* @param def the Compressor( "deflater")
* @paramサイズ出力バッファサイズ
* @exceptionサイズが<= 0の場合、lexception illegalargumentexception
*/
public deflateroutputStream(outputStream out、deflater def、int size){
スーパー(out);
if(out == null || def == null){
新しいnullpointerexception();
} else if(size <= 0){
新しいIllegalargumentException( "バッファサイズ<= 0")を投げる;
}
this.def = def;
buf = new byte [size];
}
/**
*指定されたコンプレッサーを使用して新しい出力ストリームを作成し、
*デフォルトのバッファサイズ。
* @param出力ストリームを出します
* @param def the Compressor( "deflater")
*/
public deflateroutputStream(outputStream out、deflater def){
これ(out、def、512);
}
boolean usesdefaultdeflater = false;
/**
*デフォルトのコンプレッサーとバッファサイズを備えた新しい出力ストリームを作成します。
* @param出力ストリームを出します
*/
public deflateroutputStream(outputStream out){
これ(out、new deflater());
usesdefaultdeflater = true;
}
/**
*このメソッドにバイトを書き込みます
*バイトを書くことができるまでブロックします。
* @param b書かれているバイト
* @exception IOException I/Oエラーが発生した場合
*/
public void write(int b)throws ioexception {
byte [] buf = new byte [1];
buf [0] =(byte)(b&0xff);
書き込み(buf、0、1);
}
/**
*圧縮出力ストリームに一連のバイトを書き込みます
*メソッドは、すべてのバイトが書き込まれるまでブロックされます。
* @param b記述するデータ
* @paramは、データの開始オフセットをオフにします
* @param lenデータの長さ
* @exception IOException I/Oエラーが発生した場合
*/
public void write(byte [] b、int off、int len)はioexceptionをスローします{
if(def.finished()){
新しいioException( "Write Beyond End of Stream");
}
if((off | len |(off + len)|(b.length-(off + len))<0){
新しいindexoutofboundsexception()をスローします。
} else if(len == 0){
戻る;
}
if(!def.finished()){
//一度にストライドバイト以外にdeflateします
// deflateBytesでの過剰コピー(deflater.cを参照)
int stride = buf.length;
for(int i = 0; i <len; i+= stride){
def.setInput(b、off + i、math.min(stride、len -i));
while(!def.NeedSinput()){
deflate();
}
}
}
}
/**
*閉じることなく、圧縮データの書き込みデータを出力ストリームに書き終えます
*複数のフィルターを適用するときは、基礎となるストリームを使用します
*同じ出力ストリームを連続して。
* @exception IOException I/Oエラーが発生した場合
*/
public void finish()throws ioexception {
if(!def.finished()){
def.finish();
while(!def.finished()){
deflate();
}
}
}
/**
*残りの圧縮データを出力ストリームに書き込み、
*基礎となるストリーム。
* @exception IOException I/Oエラーが発生した場合
*/
public void close()throws ioexception {
if(!閉じた){
仕上げる();
if(usesdefaultdeflater)
守る();
out.close();
閉じた= true;
}
}
/**
*圧縮データの次のブロックを出力ストリームに書き込みます。
* @Throws IOException I/Oエラーが発生した場合
*/
保護されたvoid deflate()throws ioException {
int len = def.deflate(buf、0、buf.length);
if(len> 0){
out.write(buf、0、len);
}
}
}