数字处理
1.double 的向上,向下,四舍五入,以及转为 int1.向输出上取整public static void mathCeil() { Double number = 5.3; // Double 向上取整 double ceil = Math.ceil(number); System.out.println("number:" + number); System.out.println("ceil:" + ceil); int ceilRes = new Double(ceil).intValue(); System.out.println("ceilRes:" + ceilRes);}
输出:
number:5.3ceil:6.0ceilRes:6
2.向下取整public static void mathFloor () { Double number = 5.9; // Double 向下取整 double floor = Ma ...
时间日期整理
Java 中的 Timestamp 对应 mysql 中的 dateTime 类型比如:java 的 bean 类型是 Timestamp插入的时候这么写,这样插入完成后。mysql 数据库里就是 datatime 类型的数据了。
setUpdateTime(new Timestamp(new Date().getTime()));
也可以分开写如下:
java.util.Date date = new java.util.Date(); // 获取一个Date对象Timestamp timeStamp = new Timestamp(date.getTime()); // 给对象赋值该值插入就行了
Java:String 和 Date、Timestamp 之间的转换
String 与 Date(java.util.Date)互转String -> Date
String dateStr = "2010/05/04 12:34:23";Date date = new Date();//注意format的格式要与日期String的格式相匹配DateForm ...
执行简单的定时任务之ScheduledExecutorService
ScheduledExecutorService有线程池的特性,也可以实现任务循环执行,可以看作是一个简单地定时任务组件,因为有线程池特性,所以任务之间可以多线程并发执行,互不影响,当任务来的时候,才会真正创建线程去执行我们在做一些普通定时循环任务时可以用它,比如定时刷新字典常量,只需要不断重复执行即可,这篇文章讲解一下它的用法以及注意事项,不涉及底层原理
注意:我们都知道,在使用线程池的时候,如果我们的任务出现异常没有捕获,那么线程会销毁被回收,不会影响其他任务继续提交并执行,但是在这里,如果你的任务出现异常没有捕获,会导致后续的任务不再执行,所以一定要try...catch
1. 延迟不循环任务schedule方法schedule(Runnable command, long delay, TimeUnit unit)参数 1:任务参数 2:方法第一次执行的延迟时间参数 3:延迟单位说明:延迟任务,只执行一次(不会再次执行),参数 2 为延迟时间
案例说明:
@Component@Slf4jpublic class MineExecutors { private f ...
获取当前系统的文件分隔符
String outPath = parentFile.getCanonicalPath() + File.separator + "temp-" + fileName;// File.separator会根据当前的系统自动获得'/'或者'\\'
Date类型
两个日期之间相差的天数,日期为单位(比如相差两秒,可能就相差一天,12:23:59:59 和 13:01:00:00 就相差一天)/** * date2比date1多的天数 * @param date1 * @param date2 * @return */private static int differentDays(Date date1,Date date2) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); int day1= cal1.get(Calendar.DAY_OF_YEAR); int day2 = cal2.get(Calendar.DAY_OF_YEAR); int year1 = cal1.get(Calendar.YEAR); int year2 = cal2.get(Calendar.YEAR); ...
解决cookie跨域问题
业务需求:当前网站想要访问第三方网站的页面,第三方网站的页面接口都需要使用 cookie 认证授权遇到的问题:当前网站和第三方网站不同域。在当前网站使用 iframe。跳转到第三方时。后台通过接口得到的 cookie 无法传递
解决方式 1:nginx 反向代理,用当前网站的域代理第三方网站,然后用当前网站的域+第三方网站的接口 url 就能获取第三方网站的页面或数据示例:nginx.conf
server { listen 19100; #server_name localhost; location / { proxy_pass http://47.95.34.252:8084; } }
js
const url = 'http://127.0.0.1:19100/JcjcGl/Dcztjctky/Dcztbx'function initPage() { $.ajax({ url: Hussar.ctxPat ...
获得文件路径三种方法以及区别
File file = new File(".\\test.txt");// 返回构造File对象时的路径// 因此,如果File对象是使用相对路径创建的,则返回的值也将是相对路径。如果是绝对路径就返回绝对路径。System.out.println(file.getPath());// 该方法返回文件的绝对路径。请注意!这里是有大坑的。如果你的文件在Java工程内,路径是按照编译后的路径计算的。// 该方法只解析当前目录(代码所在的目录)的相对路径,如果初始化中的路径包含了速记符,速记符将不会被解析。System.out.println(file.getAbsolutePath());// 速记符不被解析有时候是很痛苦的事,我们可能需要知道具体的路径。getCanonicalPath()方法解决了这个问题。由于getCanonicalPath()读取的是文件系统,因此会降低性能。// 如果我们确定没有使用速记符,并且驱动器号大小写已标准化(如果使用Windows OS),我们应该首选使用getAbsoultePath(),除非你的项目中必须使用getCanonica ...
删除文件
删除单个文件/** * 删除单个文件 * * @param fileName 被删除文件的文件名 * @return 单个文件删除成功返回true, 否则返回false */ public static boolean deleteFile(String fileName) { File file = new File(fileName); if (file.isFile() && file.exists()) { file.delete(); System.out.println("删除单个文件" + fileName + "成功!"); return true; } else { System.out.println("删除单个文件" + fileName + "失败!"); return false; } } ...
unzip解压
无论压缩文件下有多少层级,所有解压后的文件都统一放在 outFileDir 文件夹下,且只保留压缩的文件,压缩的文件夹不保留import java.io.*;import java.nio.charset.Charset;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;public class A { public static void main(String[] args) { System.out.println(unzip("C:\\Users\\13551\\Desktop\\a\\a.zip", "C:\\Users\\13551\\Desktop\\a")); } public static boolean unzip(String inFilePath, String outDirPath) { // 先对 ...
过滤枚举
枚举类
/** * 用户角色的枚举类 * */public enum RoleEnum { // 仓储角色 LABORATORY_PERSON("LABORATORY_PERSON", "实验室人员", "365ef7b96870d8acdd4a016866193278", "laboratoryPersonIndex.html", "goods"), EQUIPMENT_MANAGEMENT_PERSON("EQUIPMENT_MANAGEMENT_PERSON", "设备管理员", "34ea46 ...
stream用法整理
stream 流处理将用,拼接的字符串转为 Double 集合// 将用','拼接的字符串转为Double集合List<Double> singlePoint = Arrays.asList(pointStr.split(",")) .stream() .map(str -> Double.parseDouble(str.trim())) .collect(Collectors.toList());
批量删除特定前缀key
redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del
其中 xargs -L 指令表示 xargs 一次读取的行数,也就是每次删除的 key 数量,一次读取太多 xargs 会报错
后台运行jar包与停止运行
将运行的 jar 错误日志信息输出到 log.file 文件中,然后(>&1)就是继续输出到标准输出(前面加的&,是为了让系统识别是标准输出),最后一个&,表示在后台运行。
nohup java -jar 包名.jar > log.file 2>&1 &[1] 669 #669表示运行的pid
lambda用法整理
使用 lambda 表达式建立子线程任务并阻塞主线程// 阻塞主线程的计数器 CountDownLatch countDownLanch = new CountDownLatch(cycleNum); // 局部的线程池 ExecutorService executor = Executors.newFixedThreadPool(cycleNum > 4 ? 4 : cycleNum); // cycleNum是要执行子线程的次数 for (int i = 0; i < cycleNum; i++) { int start = i * 10000; int num = 10000; executor.execute(new Runnable() { @Override public void run() { try ...
java.lang.UnsupportedOperationException:null 使用List.Add()或List.addALL() 报错
还原现场:
List<Integer> agentTeamIdsList =Arrays.asList(agentIdArray);agentTeamIdsList.add(123011);
将一个 Integer 类型数组转成 List, 上面的 Arrays.asList 是可以转成功的;
然后往转成功的 list 里面继续添加 值;
IDEA 里面并没有检测出错误,实则报错:
java.lang.UnsupportedOperationException: null
原因:
Arrays.asList 转成的 ArrayList 实际上跟往常我们创建的 new ArrayList 是不同的。
这个是 Arrays 的内部类 ArrayList:
而我们往常使用的
解决方案:
List<Integer> agentTeamIdsList =new ArrayList<>(Arrays.asList(agentIdArray));
相同数据整合示例
需求:多个对象,这些对象中的部分某个特定的属性相同。把所有的对象根据这个特定的属性整合成多个分组(或统计其他)
方法示例:
public void demo1(List<Integer> ids) { List<TYwglYsXlfinfo> tYwglYsXlfinfos = new ArrayList<>(); List<WlHzVO> exportList = new ArrayList<>(); if (tYwglYsXlfinfos.size() > 0) { WlHzVO wlHzVO = new WlHzVO(); BeanUtils.copyProperties(tYwglYsXlfinfos.get(0), wlHzVO); for (int i = 0; i < tYwglYsXlfinfos.size(); i++) { TYwglYsXlfinfo tYwglYsXlfinfo = ...
区段过滤算法
需求:一个大的区段有小半径曲线段,复合曲线,平曲线和竖曲线各个不同数量不同长度的多个区段这些区段可能覆盖,交叉或完全不重叠
求:不与任意特殊区段有关联的多个直线段
公共方法:
public List<ImportSectionVO> filterQd(List<ImportSectionVO> filterList, List<ImportSectionVO> zxdList, String name) { ImportSectionVO zxd; ImportSectionVO filter; for (int i = 0; i < filterList.size(); i++) { filter = filterList.get(i); for (int j = zxdList.size() - 1; j >= 0; j--) { zxd = zxdList.get(j); if (filter.getEndMile ...
区段合并算法
需求:将不连续的一维数组整合为多个连续的二维数组示例:
public static void main(String[] args) { Integer[] arr = {1}; // Integer[] arr = {1, 2}; // Integer[] arr = {1, 3}; // Integer[] arr = {1, 2, 4}; // Integer[] arr = {1, 3, 4}; // Integer[] arr = {1, 2, 3}; // Integer[] arr = {1, 2, 4, 5}; // Integer[] arr = {1, 2, 4, 6, 7}; // Integer[] arr = {1, 4, 6, 7}; // Integer[] arr = {1, 2, 4, 5, 7& ...
layer弹出层里再弹出一个弹出层导致新的弹出层重复弹出的问题
解决办法:在 layui 的 layer 配置 json 里给每个弹出层指定个不同的 id 即可
let index = layer.open({ type: 1, title: false, move: $('#uploadHead'), closeBtn: 0, area: ['5.1979rem', '2.5052rem'], content: $('#uploadFileModel'), id: 'layer1'})layer.confirm( '是否取消本次文件上传?', { skin: 'confirm-class', icon: 3, title: '提示', id: 'layer2' }, function (index1) { // index1表示确认框代表的弹出层实例 layer. ...
SpringBoot中使用Quartz执行任务对象(job)中无法注入bean的问题
一、问题描述SpringBoot 整合 Quartz 进行定时任务开发时,job 中注入业务 Service,使用 @Autowired 注解获取对象为 null ,执行时报空指针异常
二、分析Spring 容器可以管理 Bean,但是 Quartz 的 job 是自己管理的,job 无法被容器识别,即使在自定义的 job 上面加上@Component 注解,依然无效,原因是 job 对象在 spring 容器加载的时候,能够注入 bean,但是在调度时,job 对象会重新创建,此时就导致了已经注入的对象丢失,因此报空指针异常。
三、解决办法
3.1 采用自定义静态工具类的方式,创建 AppContextUtil 类,实现 ApplicationContextAware 接口,此工具类会在 spring 容器启动后,自动加载,使用其提供的 Bean 方法获取想要的 bean 即可,代码如下:
import lombok.extern.slf4j.Slf4j;import org.springframework.beans.BeansException;import org.spr ...