前言
日常开发、运维中,可能需要使用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脚本处理业务暂时先记录到这,后续再进行补充