使用Java脚本在正式环境处理业务

  前言

  日常开发、运维中,可能需要使用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);
            }
        }
    }
}

  编译、运行

 

 

 

  补充

  2023-10-30更新

  可以写一个bat脚本快速编译、执行java代码,例如常见的复制指定附件

  C:\Users\XFT User\Desktop\file_copy

   lib放的是运行java需要的依赖包:hutool-all-5.7.4.jar

 

  FileCopy.java

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

/**
 *    cmd命令编译、运行有依赖包的java脚本
 */
public class FileCopy {
    //日志
    private static Logger log = Logger.getLogger("FileCopy");

    static {
        try {
            //设置日志文件路径、输出格式
            String pattern = System.getProperty("user.dir") + "\\" + DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + ".log";
            FileHandler fileHandler = new FileHandler(pattern, true);
            fileHandler.setFormatter(new SimpleFormatter());
            log.addHandler(fileHandler);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * main函数
     */
    public static void main(String[] args) {
        fileCopy();
    }

    /**
     * 文件附件
     */
    private static void fileCopy(){
        //源文件夹
        String srcPath = "C:\\Users\\XFT User\\Desktop\\file_copy\\";
        //目标文件夹
        String destPath = System.getProperty("user.dir") + "\\fj\\";
        //需要拷贝的文件
        String[] files = {
                "start.bat",
                "FileCopy.java",
        };
        for (String file : files) {
            try{
                FileUtil.copy(new File(srcPath+file),new File(destPath+file),false);
                log.info(file+"复制成功!\n");
            }catch (Exception e){
                log.warning(file+"复制失败!"+e.getMessage()+"\n");
            }
        }
    }

}

  start.bat

@echo off

title cmd运行java脚本

:: 切换目录路径
cd /d C:\Users\XFT User\Desktop\file_copy

:: 指定jdk
set JAVA_HOME=E:\Java\jdk1.8.0_131
set Path=%JAVA_HOME%\bin

:: java文件编译,生成class文件(java文件编码需ANSI / GB2312,不需要指定package)
:: 运行class,指定classpath,window用;,linux用:,编译同理
:: 命令1 && 命令2 ... ,仅当前面的命令执行成功才会执行后面的命令
javac -classpath ".;./lib/*" FileCopy.java && java -classpath ".;./lib/*" FileCopy

:: cmd窗口停留
pause;

  运行效果

 

 

   后记

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

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

 

posted @ 2022-04-29 15:58  huanzi-qch  阅读(130)  评论(0编辑  收藏  举报