首页 > 技术文章 > 使用Java脚本在正式环境处理业务

huanzi-qch 2022-04-29 15:58 原文

  前言

  日常开发、运维中,可能需要使用java脚本在正式环境来处理业务,本文记录cmd命令编译、运行有依赖包的java脚本,linux执行java命令同理

 

  简单测试

import cn.hutool.core.date.DateUtil;

/*
    cmd命令编译、运行有依赖包的java脚本
*/
public class Test {
    public static void main(String[] args) {
        System.out.println("cmd执行java脚本");

        System.out.println("使用hutool工具依赖包DateUtil:"+DateUtil.now());
    }
}

  编译,java文件编码格式需要为ANSI

javac -classpath hutool-all-5.7.4.jar; Test.java

  运行

java -classpath hutool-all-5.7.4.jar; Test

  需要将依赖包跟java脚本放在同一文件夹下

 

 

  业务实操 

  1、给定文件路径集合,从附件数据中找到这些文件并这些文件打成一个压缩包,需要确保没有同名文件

  新建几个测试附件数据

E:\fj\
    新建文本文档.txt
    新建文本文档 (2).txt
    新建文本文档 (3).txt
    1\
        1新建文本文档.txt
        1新建文本文档 (2).txt
    2\
        2新建文本文档.txt
        2新建文本文档 (2).txt

 

  编写java脚本

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;

/*
    cmd命令编译、运行有依赖包的java脚本
*/
public class Test {
    private static final ArrayList<File> fileArrayList = new ArrayList<>();
    private static ArrayList<String> fileNameArrayList;
    
    //附件根文件夹
    private static final String fjRootPath = "E:\\fj";
    
    //最终的压缩包文件
    private static final String zipFile = "E:\\test\\附件.zip";
    
    //需要导出的附件,需要确保没有同名文件
    private static final String[] fileNames = {
            "E:\\fj\\新建文本文档.txt",
            "E:\\fj\\新建文本文档 (3).txt",
            "E:\\fj\\1\\1新建文本文档.txt",
            "E:\\fj\\2\\2新建文本文档.txt",
    };
    
    /**
     * main函数
     */
    public static void main(String[] args) {
        //转成list,方便进行contains判断
        fileNameArrayList = (ArrayList<String>) Arrays.stream(fileNames).collect(Collectors.toList());

        System.out.println("需要导出的附件数量:"+fileNameArrayList.size());

        //递归扫描文件夹
        scanFile(new File(fjRootPath));

        //压缩zip
        ZipUtil.zip(FileUtil.file(zipFile), false, fileArrayList.toArray(new File[0]));

        System.out.println("操作完成!共导出了"+fileArrayList.size()+"个附件");
    }

    /**
     * 递归扫描文件夹
     */
    private static void scanFile(File file){
        if (file.isFile()) {
            String filePath = file.getPath();
            if (fileNameArrayList.contains(filePath)) {
                fileArrayList.add(file);
            }
        } else if (file.isDirectory()) {
            for (File listFile : Objects.requireNonNull(file.listFiles())) {
                scanFile(listFile);
            }
        }
    }
}

  编译、运行

 

 

 

 

  

  2、按修改时间,导出指定时间范围内的附件数据,并压缩成一个压缩包

  先造一批测试数据

 

   编写java脚本

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/*
    cmd命令编译、运行有依赖包的java脚本
*/
public class Test {
    private static final ArrayList<File> fileArrayList = new ArrayList<>();

    //附件根文件夹
    private static final String fjRootPath = "E:\\fj";

    //压缩包文件
    private static final String zipFile = "E:\\test\\附件.zip";

    //开始时间 - 结束时间
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static long beginTime;
    private static long endTime;


    /**
     * main函数
     */
    public static void main(String[] args) {
        //开始时间 - 结束时间
        try {
            beginTime = dateFormat.parse("2022-04-20 00:00:00").getTime();
            endTime = dateFormat.parse("2022-04-25 23:59:59").getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //递归扫描文件夹
        scanFile(new File(fjRootPath));

        //压缩zip
        ZipUtil.zip(FileUtil.file(zipFile), false, fileArrayList.toArray(new File[0]));

        System.out.println("操作完成!共导出了"+fileArrayList.size()+"个附件");
    }

    /**
     * 递归扫描文件夹
     */
    private static void scanFile(File file){
        if (file.isFile()) {
            try {
                // 修改时间在范围之内,包含
                BasicFileAttributes attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
                long lastModifiedTime = attr.lastModifiedTime().to(TimeUnit.MILLISECONDS);
                if (lastModifiedTime >= beginTime && lastModifiedTime <= endTime) {
                    fileArrayList.add(file);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (file.isDirectory()) {
            for (File listFile : Objects.requireNonNull(file.listFiles())) {
                scanFile(listFile);
            }
        }
    }
}

  编译、运行

 

 

 

 

   后记

  PS:Java脚本不用写package,否则执行命令会报错,除非你把脚本文件放在对应路径上

  使用java脚本处理业务暂时先记录到这,后续再进行补充

 

推荐阅读