可以使用 Runtime 直接調(diào)用 winRar 的命令行命令來解壓縮
在賀蘭等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都營(yíng)銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,賀蘭網(wǎng)站建設(shè)費(fèi)用合理。
注意:
1、winRar命令使用,在dos下輸入 unrar 就可以看到全部的命令說明。該命令在winRar的安裝目錄下
2、winRar命令行命令的路徑問題,也就是path。要么加入系統(tǒng)變量path中,要么在winRar的安裝目錄下執(zhí)行程序
以下是程序代碼,解壓 test.rar 到當(dāng)前目錄下,密碼123
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TestRunTime {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();
try {
Process p = run.exec("unrar e test.rar -p123");//執(zhí)行解壓縮命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
System.out.println(lineStr);
// 檢查命令是否執(zhí)行失敗。
if (p.waitFor() != 0) {
if (p.exitValue() == 1)// p.exitValue()==0表示正常結(jié)束,1:非正常結(jié)束
System.err.println("命令執(zhí)行失敗!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java代碼
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
class ZipTest {
// 壓縮
public static void zip(String zipFileName, String inputFile)
throws Exception {
File f = new File(inputFile);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
zip(out, f, f.getName());
System.out.println("zip done");
out.close();
package?com.io2.homework;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.util.zip.ZipEntry;
import?java.util.zip.ZipOutputStream;
/*壓縮文件夾*/
public?class?MyMultipleFileZip?
{
private?String?currentZipFilePath?=?"F:/MyZip.zip";
private?String?sourceFilePath;
private?ZipOutputStream?zos;
private?FileInputStream?fis;
public?MyMultipleFileZip(String?sourceFilePath)?
{
try
{
this.sourceFilePath?=?sourceFilePath;
zos?=?new?ZipOutputStream(new?FileOutputStream(currentZipFilePath));
//設(shè)定文件壓縮級(jí)別
zos.setLevel(9);
}?catch?(FileNotFoundException?e)?
{
e.printStackTrace();
}
}
//?在當(dāng)前條目中寫入具體內(nèi)容
public?void?writeToEntryZip(String?filePath)?
{
try
{
fis?=?new?FileInputStream(filePath);
}?catch?(FileNotFoundException?e1)?
{
e1.printStackTrace();
}
byte[]?buff?=?new?byte[1024];
int?len?=?0;
try?
{
while?((len?=?fis.read(buff))?!=?-1)
{
zos.write(buff,?0,?len);
}
}?catch?(IOException?e)?
{
e.printStackTrace();
}finally
{
if?(fis?!=?null)
try?
{
fis.close();
}?catch?(IOException?e)?
{
e.printStackTrace();
}
}
}
//?添加文件條目
public?void?addFileEntryZip(String?fileName)?
{
try?
{
zos.putNextEntry(new?ZipEntry(fileName));
}?catch?(IOException?e)?
{
e.printStackTrace();
}
}
public?void?addDirectoryEntryZip(String?directoryName)
{
try?
{
zos.putNextEntry(new?ZipEntry(directoryName?+?"/"));
}?catch?(IOException?e)
{
e.printStackTrace();
}
}
//?遍歷文件夾
public?void?listMyDirectory(String?filePath)
{
File?f?=?new?File(filePath);
File[]?files?=?f.listFiles();
if(files!=null)
{
for?(File?currentFile?:?files)?
{
//?設(shè)置條目名稱(此步驟非常關(guān)鍵)
String?entryName=?currentFile.getAbsolutePath().split(":")[1].substring(1);
//?獲取文件物理路徑
String?absolutePath?=?currentFile.getAbsolutePath();
if?(currentFile.isDirectory())?
{
addDirectoryEntryZip(entryName);
//進(jìn)行遞歸調(diào)用
listMyDirectory(absolutePath);
}
else?
{
addFileEntryZip(entryName);
writeToEntryZip(absolutePath);
}
}
}
}
//?主要流程
public?void?mainWorkFlow()
{
listMyDirectory(this.sourceFilePath);
if(zos!=null)
try?
{
zos.close();
}?catch?(IOException?e)?
{
e.printStackTrace();
}
}
public?static?void?main(String[]?args)?
{
new?MyMultipleFileZip("F:/fountainDirectory").mainWorkFlow();
}
}
package?zip;
import?java.io.BufferedInputStream;
import?java.io.BufferedOutputStream;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.util.Enumeration;
import?java.util.zip.CRC32;
import?java.util.zip.CheckedOutputStream;
import?java.util.zip.ZipEntry;
import?java.util.zip.ZipFile;
import?java.util.zip.ZipOutputStream;
import?org.apache.commons.lang3.StringUtils;
public?class?ZipUtil?{
/**
?*?遞歸壓縮文件夾
?*?@param?srcRootDir?壓縮文件夾根目錄的子路徑
?*?@param?file?當(dāng)前遞歸壓縮的文件或目錄對(duì)象
?*?@param?zos?壓縮文件存儲(chǔ)對(duì)象
?*?@throws?Exception
?*/
private?static?void?zip(String?srcRootDir,?File?file,?ZipOutputStream?zos)?throws?Exception
{
if?(file?==?null)?
{
return;
}
//如果是文件,則直接壓縮該文件
if?(file.isFile())
{
int?count,?bufferLen?=?1024;
byte?data[]?=?new?byte[bufferLen];
//獲取文件相對(duì)于壓縮文件夾根目錄的子路徑
String?subPath?=?file.getAbsolutePath();
int?index?=?subPath.indexOf(srcRootDir);
if?(index?!=?-1)?
{
subPath?=?subPath.substring(srcRootDir.length()?+?File.separator.length());
}
ZipEntry?entry?=?new?ZipEntry(subPath);
zos.putNextEntry(entry);
BufferedInputStream?bis?=?new?BufferedInputStream(new?FileInputStream(file));
while?((count?=?bis.read(data,?0,?bufferLen))?!=?-1)?
{
zos.write(data,?0,?count);
}
bis.close();
zos.closeEntry();
}
//如果是目錄,則壓縮整個(gè)目錄
else?
{
//壓縮目錄中的文件或子目錄
File[]?childFileList?=?file.listFiles();
for?(int?n=0;?nchildFileList.length;?n++)
{
childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath());
zip(srcRootDir,?childFileList[n],?zos);
}
}
}
/**
?*?對(duì)文件或文件目錄進(jìn)行壓縮
?*?@param?srcPath?要壓縮的源文件路徑。如果壓縮一個(gè)文件,則為該文件的全路徑;如果壓縮一個(gè)目錄,則為該目錄的頂層目錄路徑
?*?@param?zipPath?壓縮文件保存的路徑。注意:zipPath不能是srcPath路徑下的子文件夾
?*?@param?zipFileName?壓縮文件名
?*?@throws?Exception
?*/
public?static?void?zip(String?srcPath,?String?zipPath,?String?zipFileName)?throws?Exception
{
if?(StringUtils.isEmpty(srcPath)?||?StringUtils.isEmpty(zipPath)?||?StringUtils.isEmpty(zipFileName))
{
throw?new?ParameterException(ICommonResultCode.PARAMETER_IS_NULL);
}
CheckedOutputStream?cos?=?null;
ZipOutputStream?zos?=?null;
try
{
File?srcFile?=?new?File(srcPath);
//判斷壓縮文件保存的路徑是否為源文件路徑的子文件夾,如果是,則拋出異常(防止無限遞歸壓縮的發(fā)生)
if?(srcFile.isDirectory()??zipPath.indexOf(srcPath)!=-1)?
{
throw?new?ParameterException(ICommonResultCode.INVALID_PARAMETER,?"zipPath?must?not?be?the?child?directory?of?srcPath.");
}
//判斷壓縮文件保存的路徑是否存在,如果不存在,則創(chuàng)建目錄
File?zipDir?=?new?File(zipPath);
if?(!zipDir.exists()?||?!zipDir.isDirectory())
{
zipDir.mkdirs();
}
//創(chuàng)建壓縮文件保存的文件對(duì)象
String?zipFilePath?=?zipPath?+?File.separator?+?zipFileName;
File?zipFile?=?new?File(zipFilePath);
if?(zipFile.exists())
{
//檢測(cè)文件是否允許刪除,如果不允許刪除,將會(huì)拋出SecurityException
SecurityManager?securityManager?=?new?SecurityManager();
securityManager.checkDelete(zipFilePath);
//刪除已存在的目標(biāo)文件
zipFile.delete();
}
cos?=?new?CheckedOutputStream(new?FileOutputStream(zipFile),?new?CRC32());
zos?=?new?ZipOutputStream(cos);
//如果只是壓縮一個(gè)文件,則需要截取該文件的父目錄
String?srcRootDir?=?srcPath;
if?(srcFile.isFile())
{
int?index?=?srcPath.lastIndexOf(File.separator);
if?(index?!=?-1)
{
srcRootDir?=?srcPath.substring(0,?index);
}
}
//調(diào)用遞歸壓縮方法進(jìn)行目錄或文件壓縮
zip(srcRootDir,?srcFile,?zos);
zos.flush();
}
catch?(Exception?e)?
{
throw?e;
}
finally?
{
try
{
if?(zos?!=?null)
{
zos.close();
}
}
catch?(Exception?e)
{
e.printStackTrace();
}
}
}
/**
?*?解壓縮zip包
?*?@param?zipFilePath?zip文件的全路徑
?*?@param?unzipFilePath?解壓后的文件保存的路徑
?*?@param?includeZipFileName?解壓后的文件保存的路徑是否包含壓縮文件的文件名。true-包含;false-不包含
?*/
@SuppressWarnings("unchecked")
public?static?void?unzip(String?zipFilePath,?String?unzipFilePath,?boolean?includeZipFileName)?throws?Exception
{
if?(StringUtils.isEmpty(zipFilePath)?||?StringUtils.isEmpty(unzipFilePath))
{
throw?new?ParameterException(ICommonResultCode.PARAMETER_IS_NULL);
}
File?zipFile?=?new?File(zipFilePath);
//如果解壓后的文件保存路徑包含壓縮文件的文件名,則追加該文件名到解壓路徑
if?(includeZipFileName)
{
String?fileName?=?zipFile.getName();
if?(StringUtils.isNotEmpty(fileName))
{
fileName?=?fileName.substring(0,?fileName.lastIndexOf("."));
}
unzipFilePath?=?unzipFilePath?+?File.separator?+?fileName;
}
//創(chuàng)建解壓縮文件保存的路徑
File?unzipFileDir?=?new?File(unzipFilePath);
if?(!unzipFileDir.exists()?||?!unzipFileDir.isDirectory())
{
unzipFileDir.mkdirs();
}
//開始解壓
ZipEntry?entry?=?null;
String?entryFilePath?=?null,?entryDirPath?=?null;
File?entryFile?=?null,?entryDir?=?null;
int?index?=?0,?count?=?0,?bufferSize?=?1024;
byte[]?buffer?=?new?byte[bufferSize];
BufferedInputStream?bis?=?null;
BufferedOutputStream?bos?=?null;
ZipFile?zip?=?new?ZipFile(zipFile);
EnumerationZipEntry?entries?=?(EnumerationZipEntry)zip.entries();
//循環(huán)對(duì)壓縮包里的每一個(gè)文件進(jìn)行解壓
while(entries.hasMoreElements())
{
entry?=?entries.nextElement();
//構(gòu)建壓縮包中一個(gè)文件解壓后保存的文件全路徑
entryFilePath?=?unzipFilePath?+?File.separator?+?entry.getName();
//構(gòu)建解壓后保存的文件夾路徑
index?=?entryFilePath.lastIndexOf(File.separator);
if?(index?!=?-1)
{
entryDirPath?=?entryFilePath.substring(0,?index);
}
else
{
entryDirPath?=?"";
}
entryDir?=?new?File(entryDirPath);
//如果文件夾路徑不存在,則創(chuàng)建文件夾
if?(!entryDir.exists()?||?!entryDir.isDirectory())
{
entryDir.mkdirs();
}
//創(chuàng)建解壓文件
entryFile?=?new?File(entryFilePath);
if?(entryFile.exists())
{
//檢測(cè)文件是否允許刪除,如果不允許刪除,將會(huì)拋出SecurityException
SecurityManager?securityManager?=?new?SecurityManager();
securityManager.checkDelete(entryFilePath);
//刪除已存在的目標(biāo)文件
entryFile.delete();
}
//寫入文件
bos?=?new?BufferedOutputStream(new?FileOutputStream(entryFile));
bis?=?new?BufferedInputStream(zip.getInputStream(entry));
while?((count?=?bis.read(buffer,?0,?bufferSize))?!=?-1)
{
bos.write(buffer,?0,?count);
}
bos.flush();
bos.close();
}
}
public?static?void?main(String[]?args)?
{
String?zipPath?=?"d:\\ziptest\\zipPath";
String?dir?=?"d:\\ziptest\\rawfiles";
String?zipFileName?=?"test.zip";
try
{
zip(dir,?zipPath,?zipFileName);
}?
catch?(Exception?e)
{
e.printStackTrace();
}
String?zipFilePath?=?"D:\\ziptest\\zipPath\\test.zip";
String?unzipFilePath?=?"D:\\ziptest\\zipPath";
try?
{
unzip(zipFilePath,?unzipFilePath,?true);
}
catch?(Exception?e)
{
e.printStackTrace();
}
}
}
文章名稱:javazip解壓代碼 java解壓縮包
分享鏈接:http://jinyejixie.com/article34/ddccope.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)頁設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)、用戶體驗(yàn)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)