Java中Cron表達(dá)式的生成解析及計(jì)算的工具類完整代碼
本文介紹通過java生成cron表達(dá)式,解析表達(dá)式,計(jì)算表達(dá)式執(zhí)行日期
1. 生成表達(dá)式
public static String createCronExpression(CronModel cronModel){ StringBuilder cronExp = new StringBuilder(); if(null == cronModel.getJobType()) { System.out.println("執(zhí)行周期未配置" );//執(zhí)行周期未配置 } if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { //秒 cronExp.append(cronModel.getSecond()).append(" "); //分 cronExp.append(cronModel.getMinute()).append(" "); //小時(shí) cronExp.append(cronModel.getHour()).append(" "); //每天 if(cronModel.getJobType().getValue() == 1){ //12 12 12 1/2 * ? * //12 12 12 * * ? if(cronModel.getBeApart()!=null){ cronExp.append("1");//日 cronExp.append("/"); cronExp.append(cronModel.getBeApart()+1);//月 cronExp.append(" "); cronExp.append("* "); cronExp.append("?"); }else { cronExp.append("* ");//日 cronExp.append("* ");//月 cronExp.append("?"); } } //按每周 else if(cronModel.getJobType().getValue() == 3){ //一個(gè)月中第幾天 cronExp.append("? "); //月份 cronExp.append("* "); //周 Integer[] weeks = cronModel.getDayOfWeeks(); for(int i = 0; i < weeks.length; i++){ if(i == 0){ cronExp.append(weeks[i]); } else{ cronExp.append(",").append(weeks[i]); } } } //按每月 else if(cronModel.getJobType().getValue()== 2){ //一個(gè)月中的哪幾天 Integer[] days = cronModel.getDayOfMonths(); for(int i = 0; i < days.length; i++){ if(i == 0){ if(days[i]==32){ //本月最后一天 String endMouthCron="0 0 0 L * ?"; return endMouthCron; }else { cronExp.append(days[i]); } } else{ cronExp.append(",").append(days[i]); } } //月份 cronExp.append(" * "); //周 cronExp.append("?"); } //按每年 else if(cronModel.getJobType().getValue()== 4){ //一個(gè)年中的哪幾天 Integer[] days = cronModel.getDayOfMonths(); if(ArrayUtil.isEmpty(days)){ cronExp.append("*"); }else{ for(int i = 0; i < days.length; i++){ if(i == 0){ cronExp.append(days[i]); } else{ cronExp.append(",").append(days[i]); } } } //月份 Integer[] months = cronModel.getMonths(); if (ArrayUtil.isEmpty(months)) { cronExp.append(" *"); }else{ for (int i = 0; i < months.length; i++){ Integer month = months[i]; if (month > 12){ throw new RuntimeException("月份數(shù)據(jù)異常: "+ Arrays.toString(months)); } if(i == 0){ cronExp.append(" ").append(month); }else{ cronExp.append(",").append(month); } } } cronExp.append(" ?"); } else if(cronModel.getJobType().getValue() == 0){ cronExp.append("* ");//日 cronExp.append("* ");//月 cronExp.append("?");//周 } } return cronExp.toString(); }
public static String createLoopCronExpression(int rate, int cycle) { String cron = ""; switch (rate) { case 0:// 每cycle秒執(zhí)行一次 cron = "0/" + cycle + " * * * * ?"; break; case 1:// 每cycle分鐘執(zhí)行一次 cron = "0 0/" + cycle + " * * * ?"; break; case 2:// 每cycle小時(shí)執(zhí)行一次 cron = "0 0 0/" + cycle + " * * ?"; break; case 3:// 每cycle天的0點(diǎn)執(zhí)行一次 cron = "0 0 0 1/" + cycle + " * ?"; break; case 4:// 每cycle月的1號(hào)0點(diǎn)執(zhí)行一次 cron = "0 0 0 1 1/" + cycle + " ? "; break; case 5:// 每天cycle點(diǎn)執(zhí)行一次 cron = "0 0 " + cycle+ " * * ?"; break; default:// 默認(rèn)每cycle秒執(zhí)行一次 cron = "0/1 * * * * ?"; break; } return cron; }
2. 解析表達(dá)式
/** * 生成計(jì)劃的詳細(xì)描述 * *@param cronModel *@return String */ public static String createDescription(CronModel cronModel){ StringBuffer description = new StringBuffer(""); //計(jì)劃執(zhí)行開始時(shí)間 // Date startTime = cronModel.getScheduleStartTime(); if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { //按每天 if(cronModel.getJobType().getValue() == 1){ Integer beApart = cronModel.getBeApart(); if(beApart !=null){ description.append("每間隔").append(beApart).append("天"); }else{ description.append("每天"); } description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); description.append("執(zhí)行"); } //按每周 else if(cronModel.getJobType().getValue() == 3){ if(cronModel.getDayOfWeeks() != null && cronModel.getDayOfWeeks().length > 0) { String days = ""; for(int i : cronModel.getDayOfWeeks()) { days += "周" + i; } description.append("每周的").append(days).append(" "); } if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { description.append(","); description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); } description.append("執(zhí)行"); } //按每月 else if(cronModel.getJobType().getValue() == 2){ //選擇月份 if(cronModel.getDayOfMonths() != null && cronModel.getDayOfMonths().length > 0) { String days = ""; for(int i : cronModel.getDayOfMonths()) { days += i + "號(hào)"; } description.append("每月的").append(days).append(" "); } description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); description.append("執(zhí)行"); } } return description.toString(); }
3. 計(jì)算表達(dá)式執(zhí)行日期
需要引入quartz依賴
<dependency> <groupId>quartz</groupId> <artifactId>quartz</artifactId> <version>1.5.2</version> </dependency>
/** * 計(jì)算表達(dá)式最近幾次執(zhí)行時(shí)間 * @param cronExpress 表達(dá)式 * @param num 次數(shù) * @return 時(shí)間集合 */ public static List<String> getCronNextTimes(String cronExpress,Integer num){ if(StrUtil.isEmpty(cronExpress)){ throw new RuntimeException("cron 表達(dá)式不能為空"); } //判斷cron表達(dá)式 if(!CronSequenceGenerator.isValidExpression(cronExpress)){ throw new RuntimeException("cron 表達(dá)式格式不正確,cron: "+cronExpress); } if(num == null || num == 0){ num = 1; } List<String> list = new ArrayList<>(); CronTrigger cronTrigger = new CronTrigger(); try { cronTrigger.setCronExpression(cronExpress); } catch (ParseException e) { throw new RuntimeException("cron表達(dá)式不正確,cron: "+cronExpress); } List<Date> dates = TriggerUtils.computeFireTimes(cronTrigger, null, num); String format = "yyyy-MM-dd HH:mm:ss"; for (Date date : dates) { list.add(DateUtil.format(date,format)); } return list; }
4. 測(cè)試
public static void main(String[] args) { CronModel cronModel = new CronModel(); cronModel.setJobType(JobEnum.DAY);//按每天 //每隔幾天執(zhí)行 cronModel.setBeApart(1); String cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); //執(zhí)行時(shí)間:每天的12時(shí)12分12秒 end System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.WEEK);//每周的哪幾天執(zhí)行 Integer[] dayOfWeeks = new Integer[3]; dayOfWeeks[0] = 1; dayOfWeeks[1] = 2; dayOfWeeks[2] = 3; cronModel.setDayOfWeeks(dayOfWeeks); cronModel.setJobType(JobEnum.WEEK); cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.MONTH);//每月的哪幾天執(zhí)行 Integer[] dayOfMonths = new Integer[3]; dayOfMonths[0] = 1; dayOfMonths[1] = 21; dayOfMonths[2] = 13; cronModel.setDayOfMonths(dayOfMonths); cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.EVERY);//每天的幾點(diǎn)幾分幾秒開始 cropExp = createCronExpression(cronModel); System.out.println(cropExp); System.out.println(getCronNextTimes(cropExp, 5)); }
5. 完整代碼
gitee地址:
https://gitee.com/zhenglm/tools.git
/** * @author zlm * @date 2023/8/3 */ public enum JobEnum { EVERY("每天",0), DAY("日",1), MONTH("月",2), WEEK("周",3), YEAR("年",4), ; JobEnum(String name,Integer value) { this.name = name; this.value = value; } private final String name; private final Integer value; public Integer getValue() { return value; } public String getName() { return name; } }
public class CronModel { Integer[] dayOfWeeks; Integer[] dayOfMonths; Integer[] months; Integer second; Integer minute; Integer hour; /** * 類型 */ JobEnum jobType; /** * 間隔 */ Integer beApart; public Integer[] getDayOfWeeks() { return dayOfWeeks; } public void setDayOfWeeks(Integer[] dayOfWeeks) { this.dayOfWeeks = dayOfWeeks; } public Integer[] getDayOfMonths() { return dayOfMonths; } public void setDayOfMonths(Integer[] dayOfMonths) { this.dayOfMonths = dayOfMonths; } public Integer[] getMonths() { return months; } public void setMonths(Integer[] months) { this.months = months; } public Integer getSecond() { return second == null ? 0 : second; } public void setSecond(Integer second) { this.second = second; } public Integer getMinute() { return minute == null ? 0 : minute; } public void setMinute(Integer minute) { this.minute = minute; } public Integer getHour() { return hour==null ? 0 : hour; } public void setHour(Integer hour) { this.hour = hour; } public JobEnum getJobType() { return jobType == null ? JobEnum.DAY : jobType; } public void setJobType(JobEnum jobType) { this.jobType = jobType; } public Integer getBeApart() { return beApart; } public void setBeApart(Integer beApart) { this.beApart = beApart; } }
/** * @author zlm * @date 2023/8/3 * * 字段 允許值 允許的特殊字符 * 秒 0-59 , - * / * 分 0-59 , - * / * 小時(shí) 0-23 , - * / * 日期 1-31 , - * ? / L W C * 月份 1-12 或者 JAN-DEC , - * / * 星期 1-7 或者 SUN-SAT , - * ? / L C # * 年(可選) 留空, 1970-2099 , - * / * * * 表示所有值; * ? 表示未說(shuō)明的值,即不關(guān)心它為何值; * - 表示一個(gè)指定的范圍; * , 表示附加一個(gè)可能值; * / 符號(hào)前表示開始時(shí)間,符號(hào)后表示每次遞增的值; * L("last") ("last") "L" 用在day-of-month字段意思是 "這個(gè)月最后一天";用在 day-of-week字段, 它簡(jiǎn)單意思是 "7" or "SAT"。 如果在day-of-week字段里和數(shù)字聯(lián)合使用,它的意思就是 "這個(gè)月的最后一個(gè)星期幾" – 例如: "6L" means "這個(gè)月的最后一個(gè)星期五". 當(dāng)我們用“L”時(shí),不指明一個(gè)列表值或者范圍是很重要的,不然的話,我們會(huì)得到一些意想不到的結(jié)果。 * W("weekday") 只能用在day-of-month字段。用來(lái)描敘最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近這個(gè) 月第15天的工作日”,即如果這個(gè)月第15天是周六,那么觸發(fā)器將會(huì)在這個(gè)月第14天即周五觸發(fā);如果這個(gè)月第15天是周日,那么觸發(fā)器將會(huì)在這個(gè)月第 16天即周一觸發(fā);如果這個(gè)月第15天是周二,那么就在觸發(fā)器這天觸發(fā)。注意一點(diǎn):這個(gè)用法只會(huì)在當(dāng)前月計(jì)算值,不會(huì)越過當(dāng)前月?!癢”字符僅能在 day-of-month指明一天,不能是一個(gè)范圍或列表。也可以用“LW”來(lái)指定這個(gè)月的最后一個(gè)工作日。 * # 只能用在day-of-week字段。用來(lái)指定這個(gè)月的第幾個(gè)周幾。例:在day-of-week字段用"6#3"指這個(gè)月第3個(gè)周五(6指周五,3指第3個(gè))。如果指定的日期不存在,觸發(fā)器就不會(huì)觸發(fā)。 * C 指和calendar聯(lián)系后計(jì)算過的值。例:在day-of-month 字段用“5C”指在這個(gè)月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在這周日或之后包括calendar的第一天。 * * */ public class CronUtil { /** * 計(jì)算表達(dá)式最近幾次執(zhí)行時(shí)間 * @param cronExpress 表達(dá)式 * @param num 次數(shù) * @return 時(shí)間集合 */ public static List<String> getCronNextTimes(String cronExpress,Integer num){ if(StrUtil.isEmpty(cronExpress)){ throw new RuntimeException("cron 表達(dá)式不能為空"); } //判斷cron表達(dá)式 if(!CronSequenceGenerator.isValidExpression(cronExpress)){ throw new RuntimeException("cron 表達(dá)式格式不正確,cron: "+cronExpress); } if(num == null || num == 0){ num = 1; } List<String> list = new ArrayList<>(); CronTrigger cronTrigger = new CronTrigger(); try { cronTrigger.setCronExpression(cronExpress); } catch (ParseException e) { throw new RuntimeException("cron表達(dá)式不正確,cron: "+cronExpress); } List<Date> dates = TriggerUtils.computeFireTimes(cronTrigger, null, num); String format = "yyyy-MM-dd HH:mm:ss"; for (Date date : dates) { list.add(DateUtil.format(date,format)); } return list; } /** * 構(gòu)建Cron表達(dá)式 * 目前支持三種常用的cron表達(dá)式 * 1.每天的某個(gè)時(shí)間點(diǎn)執(zhí)行 例:12 12 12 * * 表示每天12時(shí)12分12秒執(zhí)行 * 2.每周的哪幾天執(zhí)行 例:12 12 12 ? * 1,2,3表示每周的周1周2周3 ,12時(shí)12分12秒執(zhí)行 * 3.每月的哪幾天執(zhí)行 例:12 12 12 1,21,13 * ?表示每月的1號(hào)21號(hào)13號(hào) 12時(shí)12分12秒執(zhí)行 * * */ public static String createCronExpression(CronModel cronModel){ StringBuilder cronExp = new StringBuilder(); if(null == cronModel.getJobType()) { System.out.println("執(zhí)行周期未配置" );//執(zhí)行周期未配置 } if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { //秒 cronExp.append(cronModel.getSecond()).append(" "); //分 cronExp.append(cronModel.getMinute()).append(" "); //小時(shí) cronExp.append(cronModel.getHour()).append(" "); //每天 if(cronModel.getJobType().getValue() == 1){ //12 12 12 1/2 * ? * //12 12 12 * * ? if(cronModel.getBeApart()!=null){ cronExp.append("1");//日 cronExp.append("/"); cronExp.append(cronModel.getBeApart()+1);//月 cronExp.append(" "); cronExp.append("* "); cronExp.append("?"); }else { cronExp.append("* ");//日 cronExp.append("* ");//月 cronExp.append("?");//周 } } //按每周 else if(cronModel.getJobType().getValue() == 3){ //一個(gè)月中第幾天 cronExp.append("? "); //月份 cronExp.append("* "); //周 Integer[] weeks = cronModel.getDayOfWeeks(); for(int i = 0; i < weeks.length; i++){ if(i == 0){ cronExp.append(weeks[i]); } else{ cronExp.append(",").append(weeks[i]); } } } //按每月 else if(cronModel.getJobType().getValue()== 2){ //一個(gè)月中的哪幾天 Integer[] days = cronModel.getDayOfMonths(); for(int i = 0; i < days.length; i++){ if(i == 0){ if(days[i]==32){ //本月最后一天 String endMouthCron="0 0 0 L * ?"; return endMouthCron; }else { cronExp.append(days[i]); } } else{ cronExp.append(",").append(days[i]); } } //月份 cronExp.append(" * "); //周 cronExp.append("?"); } //按每年 else if(cronModel.getJobType().getValue()== 4){ //一個(gè)年中的哪幾天 Integer[] days = cronModel.getDayOfMonths(); if(ArrayUtil.isEmpty(days)){ cronExp.append("*"); }else{ for(int i = 0; i < days.length; i++){ if(i == 0){ cronExp.append(days[i]); } else{ cronExp.append(",").append(days[i]); } } } //月份 Integer[] months = cronModel.getMonths(); if (ArrayUtil.isEmpty(months)) { cronExp.append(" *"); }else{ for (int i = 0; i < months.length; i++){ Integer month = months[i]; if (month > 12){ throw new RuntimeException("月份數(shù)據(jù)異常: "+ Arrays.toString(months)); } if(i == 0){ cronExp.append(" ").append(month); }else{ cronExp.append(",").append(month); } } } cronExp.append(" ?"); } else if(cronModel.getJobType().getValue() == 0){ cronExp.append("* ");//日 cronExp.append("* ");//月 cronExp.append("?");//周 } } return cronExp.toString(); } /** * 生成計(jì)劃的詳細(xì)描述 * *@param cronModel *@return String */ public static String createDescription(CronModel cronModel){ StringBuffer description = new StringBuffer(""); //計(jì)劃執(zhí)行開始時(shí)間 // Date startTime = cronModel.getScheduleStartTime(); if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { //按每天 if(cronModel.getJobType().getValue() == 1){ Integer beApart = cronModel.getBeApart(); if(beApart !=null){ description.append("每間隔").append(beApart).append("天"); }else{ description.append("每天"); } description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); description.append("執(zhí)行"); } //按每周 else if(cronModel.getJobType().getValue() == 3){ if(cronModel.getDayOfWeeks() != null && cronModel.getDayOfWeeks().length > 0) { String days = ""; for(int i : cronModel.getDayOfWeeks()) { days += "周" + i; } description.append("每周的").append(days).append(" "); } if (null != cronModel.getSecond() && null != cronModel.getMinute() && null != cronModel.getHour()) { description.append(","); description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); } description.append("執(zhí)行"); } //按每月 else if(cronModel.getJobType().getValue() == 2){ //選擇月份 if(cronModel.getDayOfMonths() != null && cronModel.getDayOfMonths().length > 0) { String days = ""; for(int i : cronModel.getDayOfMonths()) { days += i + "號(hào)"; } description.append("每月的").append(days).append(" "); } description.append(cronModel.getHour()).append("時(shí)"); description.append(cronModel.getMinute()).append("分"); description.append(cronModel.getSecond()).append("秒"); description.append("執(zhí)行"); } } return description.toString(); } /** * 構(gòu)建Cron表達(dá)式 * @param rate 第幾位 * @param cycle 數(shù)值 * @return */ public static String createLoopCronExpression(int rate, int cycle) { String cron = ""; switch (rate) { case 0:// 每cycle秒執(zhí)行一次 cron = "0/" + cycle + " * * * * ?"; break; case 1:// 每cycle分鐘執(zhí)行一次 cron = "0 0/" + cycle + " * * * ?"; break; case 2:// 每cycle小時(shí)執(zhí)行一次 cron = "0 0 0/" + cycle + " * * ?"; break; case 3:// 每cycle天的0點(diǎn)執(zhí)行一次 cron = "0 0 0 1/" + cycle + " * ?"; break; case 4:// 每cycle月的1號(hào)0點(diǎn)執(zhí)行一次 cron = "0 0 0 1 1/" + cycle + " ? "; break; case 5:// 每天cycle點(diǎn)執(zhí)行一次 cron = "0 0 " + cycle+ " * * ?"; break; default:// 默認(rèn)每cycle秒執(zhí)行一次 cron = "0/1 * * * * ?"; break; } return cron; } public static void main(String[] args) { CronModel cronModel = new CronModel(); cronModel.setJobType(JobEnum.DAY);//按每天 //每隔幾天執(zhí)行 cronModel.setBeApart(1); String cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); //執(zhí)行時(shí)間:每天的12時(shí)12分12秒 end System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.WEEK);//每周的哪幾天執(zhí)行 Integer[] dayOfWeeks = new Integer[3]; dayOfWeeks[0] = 1; dayOfWeeks[1] = 2; dayOfWeeks[2] = 3; cronModel.setDayOfWeeks(dayOfWeeks); cronModel.setJobType(JobEnum.WEEK); cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.MONTH);//每月的哪幾天執(zhí)行 Integer[] dayOfMonths = new Integer[3]; dayOfMonths[0] = 1; dayOfMonths[1] = 21; dayOfMonths[2] = 13; cronModel.setDayOfMonths(dayOfMonths); cropExp = createCronExpression(cronModel); System.out.println(cropExp + ":" + createDescription(cronModel)); System.out.println(getCronNextTimes(cropExp, 5)); cronModel.setJobType(JobEnum.EVERY);//每天的幾點(diǎn)幾分幾秒開始 cropExp = createCronExpression(cronModel); System.out.println(cropExp); System.out.println(getCronNextTimes(cropExp, 5)); } }
總結(jié)
到此這篇關(guān)于Java中Cron表達(dá)式的生成解析及計(jì)算的工具類的文章就介紹到這了,更多相關(guān)Java Cron表達(dá)式生成解析計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Java編程之if-else的優(yōu)化技巧總結(jié)
說(shuō)實(shí)話,其實(shí)我很討厭在代碼里大量使用if-else,一是因?yàn)樵擃惔a執(zhí)行方式屬于面向過程的,二嘛,則是會(huì)顯得代碼過于冗余.這篇筆記,主要記錄一些自己在工作實(shí)踐當(dāng)中針對(duì)if-else的優(yōu)化心得,將會(huì)不定期地長(zhǎng)期更新,需要的朋友可以參考下2021-06-06idea中解決maven包沖突的問題(maven helper)
這篇文章主要介紹了idea中解決maven包沖突的問題(maven helper),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-12-12MyBatis 中 type-aliases-package的作用(簡(jiǎn)化類型映射)
MyBatis中type-aliases-package的作用是簡(jiǎn)化類型映射,通過指定包路徑,MyBatis會(huì)自動(dòng)掃描該包下的所有類并為這些類生成類型別名,減少XML配置文件中的冗長(zhǎng)代碼,感興趣的朋友跟隨小編一起看看吧2024-11-11Java使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)
這篇文章主要為大家詳細(xì)介紹了Java如何使用CountDownLatch實(shí)現(xiàn)統(tǒng)計(jì)任務(wù)耗時(shí)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06Java新手學(xué)習(xí)之IO流的簡(jiǎn)單使用
IO主要用于設(shè)備之間的數(shù)據(jù)傳輸,Java將操作數(shù)據(jù)流的功能封裝到了IO包中,這篇文章主要給大家介紹了關(guān)于Java新手學(xué)習(xí)之IO流簡(jiǎn)單使用的相關(guān)資料,需要的朋友可以參考下2021-10-10Java實(shí)現(xiàn)的zip壓縮及解壓縮工具類示例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip壓縮及解壓縮工具類,結(jié)合實(shí)例形式分析了java對(duì)文件的進(jìn)行zip壓縮及解壓縮的具體操作技巧,需要的朋友可以參考下2018-01-01