public static List untieZipFile(String zipFile) throws FileNotFoundException, IOException{
List fileList = new ArrayList()
// ZIP文件输入流
ZipInputStream zinStream
try {
zinStream = new ZipInputStream(new FileInputStream(zipFile))
ZipEntry ze
// pathTemp 去掉.zip后缀 生成对应的释放文件夹
String pathTemp = zipFile.replaceAll("\\\\", "/").replaceAll("//","/").substring(0, zipFile.length() - 5)
// 如果有同名目录,删除原有目录下的文件
java.io.File oldFile = new File(pathTemp)
if (oldFile.exists()) {
deleteFileList(oldFile)
}
// 解压ZIP中全部文件
while ((ze = zinStream.getNextEntry()) != null) {
if(ze.getName().indexOf(".") != -1){
// fileTemp 获得ZIP中文件列表的路径
String[] fileTemp = ze.getName().replaceAll("\\\\", "/").replaceAll("//", "/").split("/")
// writeFile ZIP中单个文件的绝对路径
String writeFile = pathTemp
for (int i = 0i <fileTemp.length-1i++) {
writeFile = writeFile + "/" + fileTemp[i]
}
java.io.File newFile = new File(writeFile)
if (!newFile.exists()) {
newFile.mkdirs()
}
// 构造出与ZIP中路径相同的输出流
OutputStream zoutStream = new FileOutputStream(writeFile + "/" + fileTemp[fileTemp.length - 1])
// 写入文件内容
int bytesRead = 0
byte[] buffer = new byte[8192]
while ((bytesRead = zinStream.read(buffer, 0, 8192)) != -1) {
zoutStream.write(buffer, 0, bytesRead)
}
zoutStream.flush()
zoutStream.close()
fileList.add(writeFile + "/" + fileTemp[fileTemp.length - 1])
}
}
zinStream.close()
} catch (FileNotFoundException e) {
throw new FileNotFoundException(FileUtils.class.getName()+ "#untieZipFile()#" + e.getMessage())
} catch (IOException e) {
throw new IOException(FileUtils.class.getName()+ "#untieZipFile()#" + e.getMessage())
}
return fileList
}
//删除目录
public static void deleteFileList(File oldFile) {
if (oldFile != null || oldFile.exists() || oldFile.isDirectory()) {
File[] oldFileList = oldFile.listFiles()
if(oldFileList!=null){
for (int i = 0i <oldFileList.lengthi++) {
if (oldFileList[i].isFile()) {
oldFileList[i].delete()
} else if (oldFileList[i].isDirectory()) {
deleteFileList(oldFileList[i])
}
}
}
oldFile.delete()
}
}
/***类名:zipFileRelease
*说明:一个zip文件解压类
*介绍:主要的zip文件释放方法releaseHandle()
* 用ZipInputStream类和ZipEntry类将zip文件的入口清单列举出来,然后
* 根据用户提供的输出路径和zip文件的入口进行组合通过DataOutputStream
* 和File类进行文件的创建和目录的创建,创建文件时的文件数据是通过
* ZipInputStream类、ZipEntry类、InputStream类之间的套嵌组合获得的。
*注意:如果zip文件中包含中文路径程序将会抛出异常
*日期:2005-7-1
*作者:Pcera
*/
import java.io.*
import java.util.*
import java.util.zip.*
class zipFileRelease{
private String inFilePath
private String releaseFilePath
private String[] FileNameArray //存放文件名称的数组
private ZipEntry entry
//
private FileInputStream fileDataIn
private FileOutputStream fileDataOut
private ZipInputStream zipInFile
private DataOutputStream writeData
private DataInputStream readData
//
private int zipFileCount = 0 //zip文件中的文件总数
private int zipPathCount = 0 //zip文件中的路径总数
/**
*初始化函数
*初始化zip文件流、输出文件流以及其他变量的初始化
*/
public zipFileRelease(String inpath,String releasepath){
inFilePath = inpath
releaseFilePath = releasepath
}
/**
*初始化读取文件流函数
*参数:FileInputStream类
*返回值:初始化成功返回0,否则返回-1
*/
protected long initInStream(ZipInputStream zipFileA){
try{
readData = new DataInputStream(zipFileA)
return 0
}catch(Exception e){
e.printStackTrace()
return -1
}
}
/**
*测试文件路径
*参数:zip文件的路径和要释放的位置
*返回值:是两位整数,两位数中的十位代表输入路径和输出路径(1输入、2输出)
* 各位数是代表绝对路径还是相对路径(1绝对、0相对)
* 返回-1表示路径无效
protected long checkPath(String inPath,String outPath){
File infile = new File(inPath)
File infile = new File(outPath)
}
*/
/**
*初始化输出文件流
*参数:File类
*返回值:初始化成功返回0,否则返回-1
*/
protected long initOutStream(String outFileA){
try{
fileDataOut = new FileOutputStream(outFileA)
writeData = new DataOutputStream(fileDataOut)
return 0
}catch(IOException e){
e.printStackTrace()
return -1
}
}
/**
*测试文件是否存在方法
*参数:File类
*返回值:如果文件存在返回文件大小,否则返回-1
*/
public long checkFile(File inFileA){
if (inFileA.exists()){
return 0
}else{
return -1
}
}
/**
*判断文件是否可以读取方法
*参数:File类
*返回值:如果可以读取返回0,否则返回-1
*/
public long checkOpen(File inFileA){
if(inFileA.canRead()){
return inFileA.length()
}else{
return -1
}
}
/**
*获得zip文件中的文件夹和文件总数
*参数:File类
*返回值:如果正常获得则返回总数,否则返回-1
*/
public long getFilFoldCount(String infileA){
try{
int fileCount = 0
zipInFile = new ZipInputStream(new FileInputStream(infileA))
while ((entry = zipInFile.getNextEntry()) != null){
if (entry.isDirectory()){
zipPathCount++
}else{
zipFileCount++
}
fileCount++
}
return fileCount
}catch(IOException e){
e.printStackTrace()
return -1
}
}
/**
*读取zip文件清单函数
*参数:File类
*返回值:文件清单数组
*/
public String[] getFileList(String infileA){
try{
ZipInputStream AzipInFile = new ZipInputStream(new FileInputStream(infileA))
//创建数组对象
FileNameArray = new String[(int)getFilFoldCount(infileA)]
//将文件名清单传入数组
int i = 0
while ((entry = AzipInFile.getNextEntry()) != null){
FileNameArray[i++] = entry.getName()
}
return FileNameArray
}catch(IOException e){
e.printStackTrace()
return null
}
}
/**
*创建文件函数
*参数:File类
*返回值:如果创建成功返回0,否则返回-1
*/
public long writeFile(String outFileA,byte[] dataByte){
try{
if (initOutStream(outFileA) == 0){
writeData.write(dataByte)
fileDataOut.close()
return 0
}else{
fileDataOut.close()
return -1
}
}catch(IOException e){
e.printStackTrace()
return -1
}
}
/**
*读取文件内容函数
*参数:File类
*返回值:如果读取成功则返回读取数据的字节数组,如果失败则返回空值
*/
protected byte[] readFile(ZipEntry entryA,ZipInputStream zipFileA){
try{
long entryFilelen
if (initInStream(zipFileA) == 0){
if ((entryFilelen = entryA.getSize()) >= 0){
byte[] entryFileData = new byte[(int)entryFilelen]
readData.readFully(entryFileData,0,(int)entryFilelen)
return entryFileData
}else{
return null
}
}else{
return null
}
}catch(IOException e){
e.printStackTrace()
return null
}
}
/**
*创建目录函数
*参数:要创建目录的路径
*返回值:如果创建成功则返回0,否则返回-1
*/
public long createFolder(String dir){
File file = new File(dir)
if (file.mkdirs()) {
return 0
}else{
return -1
}
}
/**
*删除文件
*参数:要删除的文件
*返回值:如果删除成功则返回0,要删除的文件不存在返回-2
* 如果要删除的是个路径则返回-3,删除失败则返回-1
*/
public long deleteFile(String Apath) throws SecurityException {
File file = new File(Apath.trim())
//文件或路径不存在
if (!file.exists()){
return -2
}
//要删除的是个路径
if (!file.isFile()){
return -3
}
//删除
if (file.delete()){
return 0
}else{
return -1
}
}
/**
*删除目录
*参数:要删除的目录
*返回值:如果删除成功则返回0,删除失败则返回-1
*/
public long deleteFolder(String Apath){
File file = new File(Apath)
//删除
if (file.delete()){
return 0
}else{
return -1
}
}
/**
*判断所要解压的路径是否存在同名文件
*参数:解压路径
*返回值:如果存在同名文件返回-1,否则返回0
*/
public long checkPathExists(String AreleasePath){
File file = new File(AreleasePath)
if (!file.exists()){
return 0
}else{
return -1
}
}
/**
*删除zip中的文件
*参数:文件清单数组,释放路径
*返回值:如果删除成功返回0,否则返回-1
*/
protected long deleteReleaseZipFile(String[] listFilePath,String releasePath){
long arrayLen,flagReturn
int k = 0
String tempPath
//存放zip文件清单的路径
String[] pathArray = new String[zipPathCount]
//删除文件
arrayLen = listFilePath.length
for(int i=0i<(int)arrayLeni++){
tempPath = releasePath.replace('\\','/') + listFilePath[i]
flagReturn = deleteFile(tempPath)
if (flagReturn == -2){
//什么都不作
}else if (flagReturn == -3){
pathArray[k++] = tempPath
}else if (flagReturn == -1){
return -1
}
}
//删除路径
for(k = k - 1k>=0k--){
flagReturn = deleteFolder(pathArray[k])
if (flagReturn == -1) return -1
}
return 0
}
/**
*获得zip文件的最上层的文件夹名称
*参数:zip文件路径
*返回值:文件夹名称,如果失败则返回null
*/
public String getZipRoot(String infileA){
String rootName
try{
FileInputStream tempfile = new FileInputStream(infileA)
ZipInputStream AzipInFile = new ZipInputStream(tempfile)
ZipEntry Aentry
Aentry = AzipInFile.getNextEntry()
rootName = Aentry.getName()
tempfile.close()
AzipInFile.close()
return rootName
}catch(IOException e){
e.printStackTrace()
return null
}
}
/**
*释放流,释放占用资源
*/
protected void closeStream() throws Exception{
fileDataIn.close()
fileDataOut.close()
zipInFile.close()
writeData.flush()
}
/**
*解压函数
*对用户的zip文件路径和解压路径进行判断,是否存在和打开
*在输入解压路径时如果输入"/"则在和zip文件存放的统计目录下进行解压
*返回值:0表示释放成功
* -1 表示您所要解压的文件不存在、
* -2表示您所要解压的文件不能被打开、
* -3您所要释放的路径不存在、
* -4您所创建文件目录失败、
* -5写入文件失败、
* -6表示所要释放的文件已经存在、
* -50表示文件读取异常
*/
public long releaseHandle() throws Exception{
File inFile = new File(inFilePath)
File outFile = new File(releaseFilePath)
String tempFile
String zipPath
String zipRootPath
String tempPathParent //存放释放路径
byte[] zipEntryFileData
//作有效性判断
if (checkFile(inFile) == -1) {
return -1}
if (checkOpen(inFile) == -1) {
return -2}
//不是解压再当前目录下时对路径作有效性检验
if (!releaseFilePath.equals("/")){
//解压在用户指定目录下
if (checkFile(outFile) == -1) {
return -3}
}
//获得标准释放路径
if (!releaseFilePath.equals("/")) {
tempPathParent = releaseFilePath.replace('\\','/')+ "/"
}else{
tempPathParent = inFile.getParent().replace('\\','/')+ "/"
}
//获得zip文件中的入口清单
FileNameArray = getFileList(inFilePath)
//获得zip文件的最上层目录
zipRootPath = getZipRoot(inFilePath)
//
fileDataIn = new FileInputStream(inFilePath)
zipInFile = new ZipInputStream(fileDataIn)
//判断是否已经存在要释放的文件夹
if (zipRootPath.lastIndexOf("/") >0 ){
if (checkPathExists(tempPathParent +
zipRootPath.substring(0,zipRootPath.lastIndexOf("/"))) == -1){
return -6
}
}else{
if (checkPathExists(tempPathParent + zipRootPath) == -1){
return -6
}
}
//
try{
//创建文件夹和文件
int i = 0
while ((entry = zipInFile.getNextEntry()) != null){
if (entry.isDirectory()){
//创建目录
zipPath = tempPathParent + FileNameArray[i]
zipPath = zipPath.substring(0,zipPath.lastIndexOf("/"))
if (createFolder(zipPath) == -1){
closeStream()
deleteReleaseZipFile(FileNameArray,tempPathParent)
return -4
}
}else{
//读取文件数据
zipEntryFileData = readFile(entry,zipInFile)
//向文件写数据
tempFile = tempPathParent + FileNameArray[i]
//写入文件
if (writeFile(tempFile,zipEntryFileData) == -1){
closeStream()
deleteReleaseZipFile(FileNameArray,tempPathParent)
return -5
}
}
i++
}
//释放资源
closeStream()
return 0
}catch(Exception e){
closeStream()
deleteReleaseZipFile(FileNameArray,tempPathParent)
e.printStackTrace()
return -50
}
}
/**
*演示函数
*根据用户输入的路径对文件进行解压
*/
public static void main(String args[]) throws Exception {
long flag //返回标志
String inPath,releasePath
//获得用户输入信息
BufferedReader userInput = new BufferedReader(
new InputStreamReader(System.in))
System.out.println("请输入zip文件路径:")
inPath = userInput.readLine()
System.out.println("请输入保存路径:")
releasePath = userInput.readLine()
userInput.close()
//执行解压缩
zipFileRelease pceraZip = new zipFileRelease(inPath,releasePath)
flag = pceraZip.releaseHandle()
//出错信息打印
if (flag == 0) System.out.println("释放成功!!!")
if (flag == -1) System.out.println("您所要解压的文件不存在!")
if (flag == -2) System.out.println("您所要解压的文件不能被打开!")
if (flag == -3) System.out.println("您所要释放的路径不存在!")
if (flag == -4) System.out.println("您所创建文件目录失败!")
if (flag == -5) System.out.println("写入文件失败!")
if (flag == -6) System.out.println("文件已经存在!")
if (flag == -50) System.out.println("文件读取异常!")
}
}