使用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脚本处理业务暂时先记录到这,后续再进行补充
版权声明
作者:huanzi-qch
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
捐献、打赏
请注意:相应的资金支持能更好的持续开源和创作,如果喜欢这篇文章,请随意打赏!

支付宝

微信
交流群
有事请加群,有问题进群大家一起交流!


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义