前言
日常开发、运维中,可能需要使用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脚本处理业务暂时先记录到这,后续再进行补充
原文地址:https://www.cnblogs.com/huanzi-qch/p/16206976.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。