java中經常要對一些文件壓縮
一 、導包
<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.7</version>
</dependency>
二、設置壓縮文件格式
在類中定義緩存層和編碼格式
private static byte[] _byte = new byte[1024];
private static final String ENCODE_UTF_8 = "UTF-8";
定義方法
/**
* 壓縮文件和路徑
* @param zip 壓縮文件輸出的地址 例如:D://test.zip
* @param srcFiles 要壓縮的源文件集合
*/
public static void zipFile( String zip , List<File> srcFiles ){
try {
//判斷是否爲壓縮後的文件後綴是否爲.zip結尾
if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
//創建壓縮文件輸出流
ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))) ;
//設置編碼
_zipOut.setEncoding(ENCODE_UTF_8);
//迭代多個壓縮文件
for( File _f : srcFiles ){
//執行壓縮
zipFile(zip , _zipOut , _f , "");
}
_zipOut.close();
}else{
System.out.println("target file[" + zip + "] is not .zip type file");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
三、遞歸確認壓縮文件
因爲一個文件夾中可能含有多個文件夾和文件所以每次都要去操作相應的文件和文件夾
/**
*
* @param zip 壓縮文件輸出的地址 例如:D://test.zip
* @param zipOut 被壓縮後的輸出流
* @param srcFile 被壓縮的文件
* @param path 在zip中的相對路徑
* @throws IOException
*/
private static void zipFile(String zip , ZipOutputStream zipOut , File srcFile , String path ) throws IOException{
System.out.println(" 開始壓縮文件[" + srcFile.getName() + "]");
if( !"".equals(path) && ! path.endsWith(File.separator)){
path += File.separator ;
}
//測試此抽象路徑名定義的文件或目錄是否存在
if (!srcFile.exists()) {
System.out.println("壓縮失敗,文件或目錄 " + srcFile + " 不存在!");
}else{
if( ! srcFile.getPath().equals(zip) ){
if( srcFile.isDirectory() ){//對象是否是文件夾false標識非文件夾
//listFiles能夠獲取當前文件夾下的所有文件和文件夾
//及比如我們創建了多層路徑D:\壓縮文件\壓縮二層\壓縮三層他可以得到
//D:\壓縮文件(當前)\壓縮二層(當前的下一層)
File[] _files = srcFile.listFiles() ;
if( _files.length == 0 ){
zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
zipOut.closeEntry();
}else{
for( File _f : _files ){
//遞歸迭代下一層文件夾中的文件
zipFile( zip ,zipOut , _f , path + srcFile.getName() );
}
}
}else{
FileInputStream _in = new FileInputStream(srcFile) ;
//設置壓縮路徑
zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
int len = 0 ;
while( (len = _in.read(_byte)) > 0 ){
zipOut.write(_byte, 0, len);
}
//關閉流
_in.close();
zipOut.closeEntry();
}
}
}
}
四、main方法測試
public static void main(String[] args) {
String zip = "D:\\練習壓縮.zip";
List<File> files = new ArrayList<>();
File file = new File("D:\\壓縮文件");
files.add(file);
zipFile(zip, files);
}
4.1創建對應文件目錄1
只在三層下面創建文件
4.1.1執行結果
開始壓縮文件[壓縮文件]
開始壓縮文件[壓縮二層]
開始壓縮文件[壓縮三層]
開始壓縮文件[三層下面的文件.txt]
對應壓縮出的文件
4.2創建對應文件目錄2
在二層同級創建文件和三層下面創建文件
4.2.1執行結果
開始壓縮文件[壓縮文件]
開始壓縮文件[壓縮二層]
開始壓縮文件[壓縮三層]
開始壓縮文件[三層下面的文件.txt]
開始壓縮文件[壓縮二層文件.txt]
對應壓縮出的文件