Java实时解压某个文件夹下的压缩包

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("延迟出现问题");
            }
        }
    }

}

 

你可以使用Java的ZipInputStream和ZipOutputStream来实现这个功能。具体步骤如下: 1. 使用ZipInputStream读取zip压缩包中的所有文件和文件夹。 2. 找到要替换的文件夹,并在其中找到要替换的文件。 3. 使用ZipOutputStream创建一个新的zip压缩包,并将原始zip压缩包中除要替换的文件夹之外的所有内容写入新的zip压缩包中。 4. 将要替换的文件夹中的要替换的文件写入新的zip压缩包中。 5. 关闭ZipInputStream和ZipOutputStream,删除原始zip压缩包,将新的zip压缩包重命名为原始zip压缩包的名称。 下面是一个简单的示例代码,可以帮助你开始实现这个功能: ```java import java.io.*; import java.util.zip.*; public class ReplaceFileInZip { public static void main(String[] args) throws IOException { File zipFile = new File("test.zip"); File tempFile = new File("temp.zip"); String folderName = "folder"; String fileName = "file.txt"; String replacementFile = "replacement.txt"; // Create input stream for original zip file ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile)); // Create output stream for temporary zip file ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempFile)); // Copy all entries from original zip file to temporary zip file, except the specified folder and file ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { String name = entry.getName(); if (!name.startsWith(folderName + "/") && !name.equals(fileName)) { zos.putNextEntry(new ZipEntry(name)); byte[] buffer = new byte[1024]; int len; while ((len = zis.read(buffer)) > 0) { zos.write(buffer, 0, len); } } } // Add replacement file to temporary zip file ZipEntry replacementEntry = new ZipEntry(folderName + "/" + fileName); zos.putNextEntry(replacementEntry); FileInputStream fis = new FileInputStream(replacementFile); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } fis.close(); // Close streams zis.close(); zos.close(); // Replace original zip file with temporary zip file zipFile.delete(); tempFile.renameTo(zipFile); } } ``` 在这个示例代码中,我们假设要替换的文件夹名称为"folder",要替换的文件名为"file.txt",替换文件的名称为"replacement.txt"。你需要将这些值替换为你实际使用的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值