ZipInputStreamが中国語ファイル名を正しく処理できないことを解決する
2555 ワード
Javaの文字の符号化はunicodeに基づいていることが知られています.そのため、ZipInputStreamやZipOutputStreamで圧縮や解凍を処理し、中国語のファイル名やパスに出会ったら、もちろんunicodeで処理します.しかし、現在市販されている圧縮および解凍ソフト、例えばwinzipは、unicodeを支援しないものであり、ファイル名がunicodeで符号化されたファイルに遭遇すると、処理しない.では、winzipが処理できる圧縮ファイルを作るにはどうすればいいのでしょうか.それは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に変更する必要があります.新たにメンバーが追加され、このメンバー記録符号化方式private String encoding=「UTF-8」である.5.もう一つのコンストラクション(このコンストラクションはこのclassがnewの時に、ファイル名の符号化を設定できる)public CZipOutputStream(OutputStream out,String encoding){super(out,new Deflater(Deflater.DEFAULT_COMPRESSION,true);usesDefaultDefaultDeflater=true;this.encoding=encoding; } 6.byte[]nameBytes=gettUTF 8 Bytes(e.name)を見つけます.(2つの場所があります)byte[]nameBytes=null; try { if (this.encoding.toUpperCase().equals("UTF-8")) nameBytes =getUTF8Bytes(e.name); else nameBytes= e.name.getBytes(this.encoding); } catch(Exception byteE) { nameBytes=getUTF8Bytes(e.name); } 7.ファイルをc:/java/util/zipというフォルダに保存します.CZipOutputStreamを作るには、このパス構造が必要です.classは正しいpackage構造の中に置いてある二、ZipInputStream.java 1.jdkのsrcからzipはZipInputStreamを取得する.JAvaオリジナルコード、新しいファイルをc:/java/util/zipというフォルダに保存し、ファイル名をCZipInputStreamに変更します.java. 2.元のコードの修正を開始し、class名をCZipInputStream 3に変更する.ビルドもCZipInputStream 4に変更する必要があります.新たにメンバーが追加され、このメンバー記録符号化方式private String encoding=「UTF-8」である.5.さらに新たに、public CZipInputStream(InputStream in,String encoding){super(new PushbackInputStream(in,512),new Inflater(true),512);usesDefaultInflater=true;if(in==null){throw new NullPointerException("in is null"); } this.encoding=encoding; } 6.ZipEntry=createZipEntry(gettUTF 8 String(b,0,len))を見つけます.この行は、ZipEntry e=nullに変更されます.try { if (this.encoding.toUpperCase().equals("UTF-8")) e=createZipEntry(getUTF8String(b, 0, len)); else e=createZipEntry(new String(b,0,len,this.encoding)); } catch(Exception byteE) { e=createZipEntry(getUTF8String(b, 0, len)); } 7.ファイルをc:/java/util/zipというフォルダに保存します.CZipInputStreamを作るには、このパス構造が必要であることを覚えておいてください.classは正しいpackage構造の中で以上の2つのファイルを保存した後compileはCZipOutputStreamを生成する.classおよびCZipInputStream.class、winzipを使用して[java_home]/jre/lib/rt.jarというファイルを開き、CZipOutputStream.classおよびCZipInputStream.classを入れて、「Save full path info」は必ずチェックしてください.以降、圧縮や解凍時に中国語のファイル名やパスの問題がある場合は、符号化方式を指定して処理することができる.