1.根据自己需求写路径,亲测可用。
2.只能解压zip和rar,其他未测试
3.会解压规定目录及其子目录下所有的压缩包。
4.步骤是将压缩包先保存到别的地方,再解压,再删除。
import com.github.junrar.Archive;
import net.lingala.zip4j.core.ZipFile;
import com.github.junrar.rarfile.FileHeader;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ProjectName : test
* @作者 :
* @描述 :
* @创建日期 : 2020-04-20 13:58
*/
public class TestJy {
/**
* 读取文件的路径
* @return
*/
private static String readTxtFile() {
//读取自己定义的路径文件,来获取带解压的文件目录(如果目录是死的,忽略这步)
String filePath = "/sharedata/java_jy/already_jy/lj.txt";
String encoding = "UTF-8";
String text = null;
try {
File file = new File(filePath);
if(file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
text = bufferedReader.readLine();
System.out.println(text);
read.close();
}
} catch (Exception e) {
System.out.println("读取文件路径失败");
}
return text;
}
/**
* 判断是不是zip
* @param path
* @return
*/
private static Boolean isZip(String path) {
if(path.endsWith(".zip")) {
return true;
}
return false;
}
/**
* 判断是不是rar
* @param path
* @return
*/
private static Boolean isRar(String path) {
if(path.endsWith(".rar")) {
return true;
}
return false;
}
/**
* 获取文件的编码格式
* @param path
* @return
* @throws Exception
*/
@SuppressWarnings( "unchecked" )
private static String getEncoding( String path ) throws Exception {
String encoding = "GBK" ;
ZipFile zipFile = new ZipFile( path ) ;
zipFile.setFileNameCharset( encoding ) ;
List<net.lingala.zip4j.model.FileHeader> list = zipFile.getFileHeaders() ;
for( int i = 0; i < list.size(); i++ ) {
net.lingala.zip4j.model.FileHeader fileHeader = list.get( i ) ;
String fileName = fileHeader.getFileName();
if( isMessyCode( fileName ) ) {
encoding = "UTF-8" ;
break ;
}
}
return encoding ;
}
/**
* 判断乱码
* @param str
* @return
*/
private static boolean isMessyCode( String str ) {
for( int i = 0; i < str.length(); i++ ) {
char c = str.charAt( i ) ;
// 当从Unicode编码向某个字符集转换时,如果在该字符集中没有对应的编码,则得到0x3f(即问号字符?)
// 从其他字符集向Unicode编码转换时,如果这个二进制数在该字符集中没有标识任何的字符,则得到的结果是0xfffd
if( (int)c == 0xfffd ) {
// 存在乱码
return true ;
}
}
return false ;
}
/**
* 解压zip
* @param path
* @param toPath
*/
private static void unPackZip(String path,String toPath) {
try {
File file = new File(path);
ZipFile zip = new ZipFile(file);
zip.setFileNameCharset(getEncoding(path));
zip.extractAll(toPath);
} catch (Exception e) {
System.out.println("解压zip失败:" + path);
}
}
/**
* 解压rar
* @param path
* @param toPath
*/
private static void unPackRar(String path,String toPath) {
File rarFile = new File(path);
try (Archive archive = new Archive(rarFile)) {
if (null != archive) {
FileHeader fileHeader = archive.nextFileHeader();
File file = null;
while (null != fileHeader) {
// 防止文件名中文乱码问题的处理
String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
fileName = fileName.replace("\\","/");
if (fileHeader.isDirectory()) {
//是文件夹
file = new File(toPath + File.separator + fileName);
file.mkdirs();
} else {
//不是文件夹
file = new File(toPath + File.separator + fileName.trim());
if (!file.exists()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
FileOutputStream os = new FileOutputStream(file);
archive.extractFile(fileHeader, os);
os.close();
}
fileHeader = archive.nextFileHeader();
}
}
} catch (Exception e) {
System.out.println("解压rar失败:" + path);
}
}
/**
* 删除文件
* @param path
*/
private static void delFile(String path) {
try{
File file = new File(path);
if(file.exists()) {
file.delete();
}
} catch (Exception e) {
System.out.println("删除文件失败" + e);
}
}
/**
* 复制文件到另一个文件夹
* @param path
* @param toPath
*/
private static void copyFile(String path,String toPath) {
try {
File input = new File(path);
File output = new File(toPath);
FileUtils.copyFileToDirectory(input,output,true);
} catch (Exception e) {
System.out.println("复制单个文件操作出错,不复制");
}
}
/**
* 获取文件路径
* @param path
* @return
*/
private static List<String> getFileList(String path) {
File file = new File(path);
File[] tempList = file.listFiles();
List<String> list = new ArrayList<String>();
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
String lj = tempList[i].getAbsolutePath();
if(lj.endsWith(".rar") || lj.endsWith(".zip")) {
System.out.println(tempList[i].getAbsolutePath());
list.add(lj);
}
}
if (tempList[i].isDirectory()) {
list.addAll(getFileList(tempList[i].getAbsolutePath()));
}
}
return list;
}
/**
* 1.递归路径下所有的文件夹,如果是压缩包的话,复制其到另一个目录
* 2.解压这个压缩包到当前目录。
* (1)判断后缀,分别调用zip,rar
* 3.删除该压缩包
* 4.延时一段时间后重复上面的步骤。
* @param args
*/
public static void main(String args[]){
System.out.println("解压文件的程序,别关,受累。。。。");
String filePath = readTxtFile();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
while (true) {
List<String> list = getFileList(filePath);
for(String path : list) {
if(isZip(path)) {
System.out.println(dateFormat.format(new Date()) + ":" + path);
//将待解压的文件放到别处
copyFile(path,"/sharedata/java_jy/already_jy");
unPackZip(path,path.substring(0,path.lastIndexOf("/")));
delFile(path);
try{
Thread.sleep(20000);
} catch (Exception e) {
System.out.println("延迟出现问题");
}
} else if(isRar(path)) {
System.out.println(dateFormat.format(new Date()) + ":" + path);
//将待解压的文件放到别处
copyFile(path,"/sharedata/java_jy/already_jy");
unPackRar(path,path.substring(0,path.lastIndexOf("/")));
delFile(path);
try{
Thread.sleep(20000);
} catch (Exception e) {
System.out.println("延迟出现问题");
}
}
}
try{
Thread.sleep(300000);
} catch (Exception e) {
System.out.println("延迟出现问题");
}
}
}
}