zipファイルをapacheantで解凍します(中国語のファイルまたはフォルダーソリューション)



Unzip Zip File With Apache Ant Chinese File



昨日、私はapacheを使用してapファイルを調査し、zipファイルを抽出して、経験を書き留めて共有していました。
コードを書く

package upzip

import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
import org.apache.tools.zip.*
import java.util.Enumeration

/**
* Compress and decompress ZIP files
* @author Administrator
*
*/
public class AntZip {
private ZipFile zipFile
private static int bufSize //size of bytes
private byte[] buf
private int readedBytes

/**
*
* @param bufSize cache size
*/
public AntZip(int bufSize){
this.bufSize = bufSize
this.buf = new byte[this.bufSize]
}

public AntZip(){
this(1024)
}

/**
* Survival directory
* @param directory Unpack the file storage directory
* @param subDirectory subdirectory (you can pass in an empty string when not available)
*/
private void createDirectory(String directory, String subDirectory) {
String dir[]
File fl = new File(directory)
try {
if(subDirectory == '' && fl.exists() != true)
fl.mkdir()
else if(subDirectory != ''){
dir = subDirectory.replace('\', '/').split('/')
for (int i = 0 i File subFile = new File(directory + File.separator + dir[i])
if (subFile.exists() == false)
subFile.mkdir()
directory += File.separator + dir[i]
}
}
}catch (Exception e){
e.printStackTrace()
}
}

/**
* Unzip the specified ZIP file
* @param unZipFileName filename string (including path)
* @param outputDirectory to store the directory after decompression
*/
public void unZip(String unZipFileName,String outputDirectory){
FileOutputStream fileOut
//File file
InputStream inputStream

try{
createDirectory(outputDirectory,'')
if(System.getProperty('os.name').toLowerCase().indexOf('windows') >= 0){
this.zipFile = new ZipFile(unZipFileName,'GBK')
}else if(System.getProperty('os.name').toLowerCase().indexOf('linux') >= 0){
this.zipFile = new ZipFile(unZipFileName,'UTF-8')
}
for(Enumeration entries = this.zipFile.getEntries()entries.hasMoreElements()){
ZipEntry entry = (ZipEntry)entries.nextElement()
if(entry.isDirectory()){
/ / is the directory, then create
String name = entry.getName().substring(0, entry.getName().length() - 1)
File f = new File(outputDirectory + File.separator + name)
f.mkdir()
//file.mkdirs()
}else{
//is a file
String fileName = entry.getName().replace('\', '/')
if (fileName.indexOf('/') != -1){
createDirectory(outputDirectory,fileName.substring(0, fileName.lastIndexOf('/')))
fileName=fileName.substring(fileName.lastIndexOf('/') + 1,fileName.length())
}
File f = new File(outputDirectory + File.separator + entry.getName())
f.createNewFile()
inputStream = zipFile.getInputStream(entry)
fileOut = new FileOutputStream(f)
while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
fileOut.write(this.buf , 0 , this.readedBytes )
}
fileOut.close()
inputStream.close()
}
}
this.zipFile.close()
}catch(Exception e){
e.printStackTrace()
}
}

/**
* Unzip the specified ZIP file
* @param unZipFile ZIP file to be extracted
*/
public void unZip(File unZipFile){
String outputDirectory = new String('D:/ip/') //destore the directory after decompression
unZip(unZipFile.toString(),outputDirectory)
}
}


遭遇する大きな問題は、中国語のファイル名です。もともとantは中国語をサポートしていると思っていたので問題ありませんが、実際に行ったところ、中国語のファイル名が文字化けして表示されることがわかりました。私は長い間オンラインで探していましたが、それがシステムに関連していることがわかりました。中国語のWindowsシステムのデフォルトの文字セットはGBKであり、antはファイル名の読み取りに使用される文字セットを認識していません(JAVAのデフォルトの文字セットと推定されます)。そのため、ファイル名が文字化けします。解決策はZipFile(unZipFileName、 'GBK')で、その後に文字セットが続きます。zipを抽出する文字セットを指定できます。 Linuxでは問題があります。 Linuxシステムのデフォルトの文字セットはUTF-8です。 Windowsで文字セットを参照し、解凍にUTF-8を使用できます。

if(System.getProperty('os.name').toLowerCase().indexOf('windows') >= 0){
this.zipFile = new ZipFile(unZipFileName,'GBK')
}else if(System.getProperty('os.name').toLowerCase().indexOf('linux') >= 0){
this.zipFile = new ZipFile(unZipFileName,'UTF-8')
}

研究すべき意思決定の統一された方法が見つかりませんでした。
Linuxでもまだ問題があります。つまり、Windowsシステムから中国名で過去のファイルをコピーする場合、LinuxではGBK文字セットを使用して読み取り、UTF-8にトランスコードする必要があります。ただし、Linuxでの中国語のサポートには問題が多すぎるのは事実です。
トランスコーディングコードは、次のアドレスの投稿を参照しています[url] http://jlins.iteye.com/blog/574670 [/ url]
ただし、中国語と英語の組み合わせがあると、文字化けします。この問題はあなた自身では見られません。コードをトランスコードするのは良くないかもしれません。

たくさんの問題があり、ついに私はとても無力になりました。最も簡単な方法は、正規表現を使用して、トランスコーディング後に中国語があるかどうかを判断することだと思います。ある場合は、英語のファイル名を直接変更してください。すべて問題ありません。