Java Linux服务器大文件解压慢,调用Linux命令进行解压

背景:线上Linux服务器使用TarArchiveInputStream解压太慢

    /**
     *
     * @param filePath 文件全路径
     * @param extractPath 解压路径
     * @return
     */
    public static Boolean extractFile(String filePath, String extractPath){
        File sourceFile = new File(filePath);
        if (!sourceFile.exists()) {
            logger.info("file not exist! {}------", filePath);
            return false;
        }
        File extractFolder = new File(extractPath);
        if (!extractFolder.exists()) {
        	//创建文件夹
            extractFolder.mkdirs();
        }
        //执行解压命令解压tar
        Runtime run = Runtime.getRuntime();
        Process process = null;
        logger.info("extractFile start: {}------", filePath);
        try {
        	//在单独的进程中执行指定的外部可执行程序的启动路径或字符串命令
            String cmd = "tar -zxvf " + sourceFile + " -C " + extractPath;
            logger.info("extractFile command:[{}] ", cmd);
            process = run.exec(cmd);
			
			//处理子进程的输入流
            new DealProcessStream(process.getInputStream()).start();
            //处理子进程的错误流
            new DealProcessStream(process.getErrorStream()).start();

			// 阻塞当前线程,并等待外部程序结束
            process.waitFor();
            //释放子进程
            process.destroy();

        } catch (Exception e) {
            logger.info("package File " + sourceFile + "untar failed");
            return false;
        }
        logger.info("extractFile end: {}------", filePath);
        //开发测试--------------------------------------
        //Windows开发测试--------------------------START------------
//        //解压
//        TarArchiveInputStream fin = new TarArchiveInputStream(new FileInputStream(sourceFile));
//        TarArchiveEntry entry;
//        //将tar文件解压到extractpath目录下
//        while ((entry = fin.getNextTarEntry()) != null) {
//            logger.info("file :[{}] ", entry.getName());
//            if (entry.isDirectory()) {
//                continue;
//            }
//            File curFile = new File(extractFolder, entry.getName());
//            IOUtils.copy(fin, new FileOutputStream(curFile));
//        }
//        logger.info("file extract finish!");
//        //关流
//        fin.close();
        //Windows开发测试--------------------------END------------
        return true;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
程序测试可用,直接解压导入到工程就可以,bat文件跟shell文件是用于在window跟linux上直接执行的脚本 我把开发的配置文档附上: 1.程序为定时任务,任务执行时间在bin目录下的配置文件mergeFilleUtil.properties中配置,在配置文件中,TASK_PERIOD表示任务执行时间间隔,单位为妙,如一天的时间间隔配置是86400,TASK_BEGIN_HOUR表示任务开始的小时时间,比如9点,TASK_BEGIN_MINUTE表任务开始的分钟,比如30分。 2. 程序用log4j记录日志,日志分正常信息跟错误信息两个级别,日志文件存放在log4j文件夹下。考虑到文件很多,日志解压、移动文件解压、移动1000个记录一次,合并、删除文件每合并、删除50000个记录一次, 3. 启动任务前需配置文件解压合并的路径,本程序需配置的路径如下: 1). PROVINCE_DIR:原始文件存放的路径,必须配置到省的上一级路径,比如存放安徽省的文件路径为E:\test\rootfile\anhui,那么文件的路径必须配置为E:\test\rootfile,否则不能正确显示合并结果; 2). UN_ZIP_PATH:存放解压后的文件的路径; 3). OUT_PATH:存放合并后的文件路径; 4). DONE_FILE_PATH:存放已经解压处理过的文件; 5). DELETE_PATH:配置程序运行结束后欲删除文件的路径,如想删除多个文件夹下的文件,路径之间用逗号隔开,勿加空格,比如:E:\test\rootfile,E:\test\unZip; 4. 注意事项: 本解压合并程序处理文件的逻辑如下: 程序每次解压都去PROVINCE_DIR文件下去解压,将解压后的文件存放到UN_ZIP_PATH下,之后程序启动合并程序合并UN_ZIP_PATH下文件,将合并后的文件按照省份名称存放到OUT_PATH,一个省一个文件。当解压合并结束后,程序将PROVINCE_DIR路径下的文件移动到DONE_FILE_PATH下,并且删除PROVINCE_DIR跟UN_ZIP_PATH下文件,这样保证程序每次运行PROVINCE_DIR文件夹下的文件跟UN_ZIP_PATH下的文件都是最新未处理过的,避免了不断判断文件历史记录所带来的大量时间消耗。 所以为了保证文件解压跟合并的正确性,必须配置好DELETE_PATH路径下的文件,否则合并后的结果是不准确的。
使用Java解压FTP服务器上的文件需要以下步骤: 第一步,建立与FTP服务器的连接。可以使用Java中的org.apache.commons.net.ftp.FTPClient类来实现连接。首先创建一个FTPClient对象,然后使用connect()方法连接到FTP服务器,并使用login()方法进行登录验证。 第二步,切换到FTP服务器上的目标压缩文件所在的目录。可以使用changeWorkingDirectory()方法指定目录路径。 第三步,从FTP服务器上下载压缩文件到本地。使用retrieveFile()方法将压缩文件下载到本地。 第四步,关闭与FTP服务器的连接。 第五步,使用Java的压缩解压缩工具类,例如java.util.zip.ZipInputStream或java.util.zip.GZIPInputStream,来解压下载到本地的压缩文件。可以使用FileInputStream读取压缩文件的输入流,并将其传递给解压缩工具类的构造函数。 第六步,遍历解压缩后的文件,并进行相关操作。 以下是一个示例代码,展示如何使用Java解压FTP服务器上的文件: ```java import org.apache.commons.net.ftp.FTPClient; import java.io.*; public class FTPFileDecompression { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String user = "username"; String password = "password"; String remoteFilePath = "/path/to/zipfile.zip"; String localFilePath = "path/to/save/file.zip"; FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(user, password); ftpClient.changeWorkingDirectory(remoteFilePath); File localFile = new File(localFilePath); OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(localFile)); ftpClient.retrieveFile(remoteFilePath, outputStream); outputStream.close(); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } // 解压文件 try { FileInputStream fileInputStream = new FileInputStream(localFile); ZipInputStream zipInputStream = new ZipInputStream(fileInputStream); ZipEntry zipEntry; while ((zipEntry = zipInputStream.getNextEntry()) != null) { String entryName = zipEntry.getName(); File file = new File(entryName); // 对解压缩后的文件进行操作 // ... } zipInputStream.close(); fileInputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码提供了一个基本框架,你需要根据实际的FTP服务器文件路径进行修改和调整。同时,你可能还需要处理登录失败、目录不存在、文件不存在等异常情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值