jdk8
https://www.oracle.com/java/technologies/downloads/#java8

位置 G:\安装包

jdk安装
sh
tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local
mv jdk1.8.0_341/ jdk8java 适合在 Linux 服务器(如 CentOS/RHEL)
网址
Java 8, 11, 17, 21, 23 Download for Linux, Windows and macOS
安装
sh
wget https://cdn.azul.com/zulu/bin/zulu17.44.15-ca-jdk17.0.8-linux.x86_64.rpm
rpm -ivh zulu17.44.15-ca-jdk17.0.8-linux.x86_64.rpm
java -version
# 配套字体库安装
yum install -y fontconfig mkfontscalejar启动命令
Windos
java
java -jar springboot.jar --server.port=8181 --spring.profiles.active=devLinux
java
nohup java -jar -Dserver.port=8086 -Dspring.profiles.active=prod wiki.jar >wiki.log 2>&1 &java查看日志
java
查看日志
tail -f logs 500 wiki.log
tail -f logs -n 3 wiki.log获取年月日
java
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR); //获取年
int month = c.get(Calendar.MONTH) + 1; //获取月份,0表示1月份
int day = c.get(Calendar.DAY_OF_MONTH); //获取当前天数
int first = c.getActualMinimum(c.DAY_OF_MONTH); //获取本月最小天数
int last = c.getActualMaximum(c.DAY_OF_MONTH); //获取本月最大天数
int time = c.get(Calendar.HOUR_OF_DAY); //获取当前小时
int min = c.get(Calendar.MINUTE); //获取当前分钟
int xx = c.get(Calendar.SECOND); //获取当前秒
System.out.println(year+"-"+month+"-"+day+"-"+first+"-"+last+"-"+time+"-"+min+"-"+xx);BigDecimal判断
java
System.out.println(BigDecimal.ZERO.compareTo(new BigDecimal("0")) != 0);java定时任务参考
https://blog.csdn.net/weixin_42230797/article/details/126017082
java实现web实时消息推送的七种方案
https://www.jb51.net/article/256534.htm
后端推送前端SSE方式
参考
https://www.yisu.com/zixun/727391.html
参考项目合规检查
第一步
java
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
@Slf4j
public class SSEServer {
/**
* 当前连接数
*/
private static AtomicInteger count = new AtomicInteger(0);
private static Map<String, SseEmitter> sseEmitterMap = new ConcurrentHashMap<>();
public static SseEmitter connect(String userId){
//设置超时时间,0表示不过期,默认是30秒,超过时间未完成会抛出异常
SseEmitter sseEmitter = new SseEmitter(0L);
//注册回调
sseEmitter.onCompletion(completionCallBack(userId));
sseEmitter.onError(errorCallBack(userId));
sseEmitter.onTimeout(timeOutCallBack(userId));
sseEmitterMap.put(userId,sseEmitter);
//数量+1
count.getAndIncrement();
log.info("create new sse connect ,current user:{}",userId);
return sseEmitter;
}
/**
* 给指定用户发消息
*/
public static void sendMessage(String userId, String message){
if(sseEmitterMap.containsKey(userId)){
try{
sseEmitterMap.get(userId).send(message);
}catch (IOException e){
log.error("user id:{}, send message error:{}",userId,e.getMessage());
e.printStackTrace();
}
}
}
/**
* 想多人发送消息,组播
*/
public static void groupSendMessage(String groupId, String message){
if(sseEmitterMap!=null&&!sseEmitterMap.isEmpty()){
sseEmitterMap.forEach((k,v) -> {
try{
if(k.startsWith(groupId)){
v.send(message, MediaType.APPLICATION_JSON);
}
}catch (IOException e){
log.error("user id:{}, send message error:{}",groupId,message);
removeUser(k);
}
});
}
}
public static void batchSendMessage(String message) {
sseEmitterMap.forEach((k,v)->{
try{
v.send(message,MediaType.APPLICATION_JSON);
}catch (IOException e){
log.error("user id:{}, send message error:{}",k,e.getMessage());
removeUser(k);
}
});
}
/**
* 群发消息
*/
public static void batchSendMessage(String message, Set<String> userIds){
userIds.forEach(userId->sendMessage(userId,message));
}
public static void removeUser(String userId){
sseEmitterMap.remove(userId);
//数量-1
count.getAndDecrement();
log.info("remove user id:{}",userId);
}
public static List<String> getIds(){
return new ArrayList<>(sseEmitterMap.keySet());
}
public static int getUserCount(){
return count.intValue();
}
private static Runnable completionCallBack(String userId) {
return () -> {
log.info("结束连接,{}",userId);
removeUser(userId);
};
}
private static Runnable timeOutCallBack(String userId){
return ()->{
log.info("连接超时,{}",userId);
removeUser(userId);
};
}
private static Consumer<Throwable> errorCallBack(String userId){
return throwable -> {
log.error("连接异常,{}",userId);
removeUser(userId);
};
}
}java
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import vip.huhailong.catchat.sse.SSEServer;
@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/sse")
public class SSEController {
@GetMapping("/connect/{userId}")
public SseEmitter connect(@PathVariable String userId){
return SSEServer.connect(userId);
}
@GetMapping("/process")
public void sendMessage() throws InterruptedException {
for(int i=0; i<=100; i++){
if(i>50&&i<70){
Thread.sleep(500L);
}else{
Thread.sleep(100L);
}
SSEServer.batchSendMessage(String.valueOf(i));
}
}
}第二步
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
<script>
let data = new EventSource("/cat-chat/sse/connect/huhailong")
data.onmessage = function(event){
console.log("test=>",event)
document.getElementById("result").innerText = event.data+'%';
document.getElementById("my-progress").value = event.data;
}
</script>
</head>
<body>
<div id="result"></div>
<progress id="my-progress" value="0" max="100"></progress>
</body>
</html>第三步
请求后才能看到效果

读取日志
java
package com.vstsoft.icos.project.controller.aihgjc;
import org.springframework.beans.factory.annotation.Value;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 文件监听测试 demo
**/
public class FileMonitor {
@Value("${logging.file.name}")
public String logfile;
public long lastTimeFileSize = 0; //上次文件大小
/**
* 实时输出日志信息
* @param logFile 日志文件
* @throws IOException
*/
public void realtimeShowLog(File logFile) throws IOException {
System.out.println(logfile);
//指定文件可读可写
final RandomAccessFile randomFile = new RandomAccessFile(logFile,"r");
//启动一个线程每10秒钟读取新增的日志信息
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new Runnable(){
public void run() {
try {
//获得变化部分的
randomFile.seek(lastTimeFileSize);
String tmp = "";
while( (tmp = randomFile.readLine())!= null) {
System.out.println("ceshide"+new String(tmp.getBytes("ISO8859-1")));
}
lastTimeFileSize = randomFile.length();
randomFile.close();
exec.shutdown();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}, 0, 1, TimeUnit.SECONDS);
}
public static void main(String[] args) throws Exception {
FileMonitor s = new FileMonitor();
// final File tmpLogFile = new File("d:/123.txt");
final File tmpLogFile = new File("G:/logs/screen/screen.log");
s.realtimeShowLog(tmpLogFile);
System.out.println(s.logfile);
}
}JSON转ListMap
java
List<Map> selectedData = JSONArray.parseArray(paramMap.get("selectedData").toString(), Map.class);Map遍历几种方式
方式一
java
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Integer> buy=new HashMap<>();
buy.put("苹果手机", 2);//添加键值对
buy.put("智能手表", 1);
buy.put("java书", 1);
buy.put("c语言书", 1);
buy.put("西瓜", 2);
//Map集合的遍历
//先把所有键取出来
Set<String> s1=buy.keySet();
//开始根据键找值
for (String key : s1) {
Integer value=buy.get(key);
System.out.println(key+"->>>>"+value);
}
}
}方式二
java
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}方式三
java
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class Lmtest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
Map<String, Integer> buy=new HashMap<>();
buy.put("苹果手机", 2);//添加键值对
buy.put("智能手表", 1);
buy.put("java书", 1);
buy.put("c语言书", 1);
buy.put("西瓜", 2);
//Lamubda表达式遍历
buy.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String t, Integer u) {
System.out.println(t+"->>>"+u);
}
});
}
}方式四
java
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class Lmtest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
Map<String, Integer> buy=new HashMap<>();
buy.put("苹果手机", 2);//添加键值对
buy.put("智能手表", 1);
buy.put("java书", 1);
buy.put("c语言书", 1);
buy.put("西瓜", 2);
//Lamubda表达式遍历
buy.forEach((t,u)-> {
System.out.println(t+"->>>"+u);
});
}
}HtmlToPDF
xml
<!-- itext7html转pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>3.0.2</version>
</dependency>
<!-- 中文字体支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.1.13</version>
</dependency>https://blog.csdn.net/WayneLee0809/article/details/112788783
数组转换List
java
String[] ytidlists = paramMap.get("ytidlist").toString().split(",");
List<String> ytidlist = Arrays.asList(ytidlists);两个集合合并
java
List<Map<String, Object>> newList = Stream.of(newList, oldList).flatMap(x -> x.stream()).collect(Collectors.toList());集合去除重复
参考https://juejin.cn/post/6899000526613151752
java
//1 调用
List<Map<String, Object>> list = exceptRepeat(newList);
public List<Map<String, Object>> exceptRepeat(List<Map<String, Object>> employeeList){
List<Map<String, Object>> collect = employeeList.stream()
.filter(distinctByKey(e -> e.get("YHID")))
.collect(Collectors.toList());
return collect;
}
private static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor){
Map<Object,Boolean> map=new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE)==null;
}
//2
两个集合去重排序从大到小
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(3);
list1.add(2);
list1.add(6);
list1.add(9);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(5);
list2.add(6);
list2.add(8);
System.out.println(getListDSC(list1, list2).toString());
}
/**
* 去重复两个集合,然后排序
*
* @param list1
* @param list2
* @return
*/
public static List<Integer> getListDSC(List<Integer> list1, List<Integer> list2) {
HashSet<Integer> set = new HashSet<>();
for (Integer integer : list1) {
set.add(integer);
}
for (Integer integer : list2) {
set.add(integer);
}
List<Integer> result = new ArrayList<>(set);
Collections.sort(result, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
return result;
}
输出结果:[9, 8, 6, 5, 3, 2, 1]
//取B值
List<String> lxrA = new ArrayList<>();
List<String> lxrB = new ArrayList<>();
lxrA.add("1000105038");
lxrA.add("1000120224");
lxrA.add("1000120494");
lxrB.add("1000105038");
lxrB.add("1000120499");
lxrB.removeAll(lxrA);
System.out.println(lxrB);
输出结果:[1000120499]获取日期星期几
java
//第一种
Date date = new Date();
SimpleDateFormat dateFm = new SimpleDateFormat("EEEE",Locale.SIMPLIFIED_CHINESE);
String currSun = dateFm.format(date);
System.out.println(currSun);
//第二种
/**
* 获取当前日期是星期几<br>
*
* @param date
* @return 当前日期是星期几
*/
public String getWeekOfDate(Date date) {
String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}java 获取汉字个数
java
/**
* @Description:获取字符串的长度,中文占一个字符,英文数字占半个字符
* @Author: wanglili
* @Date: 2023/2/16 11:17
* @param value:
* @return int
*/
public int chineseNum(String value) {
double valueLength = 0;
String chinese = "[\u4e00-\u9fa5]";
// 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1
for (int i = 0; i < value.length(); i++) {
// 获取一个字符
String temp = value.substring(i, i + 1);
// 判断是否为中文字符
if (temp.matches(chinese)) {
// 中文字符长度为1
valueLength += 1;
} else {
// 其他字符长度为0.5
valueLength += 0.5;
}
}
//进位取整
return Integer.valueOf(new DecimalFormat("#").format(Math.ceil(valueLength)));
}java 保留小数位数
java
public class NumUtils {
/**
* 保留两位小数
*
* @param d
* @return
*/
public static String get2Wei(double d) {
java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");
return df.format(d);
}
/**
* 保留两位小数
*
* @param d
* @return
*/
public static String get2Wei(Float d) {
if (d == null)
return "0";
java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");
return df.format(d);
}
/**
* 保留0位小数
*
* @param d
* @return
*/
public static String get0Wei(double d) {
java.text.DecimalFormat df = new java.text.DecimalFormat("#");
return df.format(d);
}
/**
* 保留0位小数
*
* @param d
* @return
*/
public static String get0Wei(Float d) {
if (d == null)
return "0";
java.text.DecimalFormat df = new java.text.DecimalFormat("#");
return df.format(d);
}
}java 获取上午或者下午中文字
java
Date parse = DateUtil.parse("2023-02-16 11:06:00", "yyyy-MM-dd hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.setTime(parse);
if(cal.get(Calendar.AM_PM) == Calendar.PM){
System.out.println("下午");
}else {
System.out.println("上午");
}下载指定目录
java
String fjlx = commonService.getDmMc("YTFJLX", map.get("FJLX").toString());
copyFile(inputStream,toPath+File.separator + fjName+fjlx+"-" + fjmc.toString());
//每次读取的大小 1KB
public static final int BYTESIZE = 1024;
public void copyFile(InputStream inStream, String toPath){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
bis = new BufferedInputStream(inStream);
//把文件流转为文件,保存在临时目录
bos = new BufferedOutputStream(new FileOutputStream(toPath));
int len = 0;
//缓冲区
byte[] buf = new byte[10*BYTESIZE];
while((len=bis.read(buf)) != -1){
bos.write(buf, 0, len);
}
bos.flush();
}catch(IOException e){
VSTLogger.error("复制单个文件操作出错", e);
e.printStackTrace();
}finally{
try {
if(bos!=null) bos.close();
if(bis!=null) bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}判断是否是数字
java
if(org.apache.commons.lang3.StringUtils.isNumeric("一")){
System.out.println("是");
}else {
System.out.println("否");
}数组转换带逗号String
java
String[] idsName = new String[ids.length];
org.apache.commons.lang3.StringUtils.join(idsName,",")文件各个jar包对比
第一步
做个.bat文件 代码如下
bash
dir/b > 11.txt第二步
在项目中生成jar包文件,然后解压文件,找到lib如图

点击1.bat 生成如图

java集合判断是否为空
java
CollectionUtils.isNotEmpty(ytList)集合排序
java
Collections.sort(taskInstanceList,(a,b)->a.getNodeId().substring(a.getNodeId().length() -1,a.getNodeId().length()).compareTo(b.getNodeId().substring(b.getNodeId().length()-1,b.getNodeId().length())));
taskInstanceList = taskInstanceList.stream().sorted(new Comparator<TaskInstance>() {
@Override
public int compare(TaskInstance o1, TaskInstance o2) {
return Integer.parseInt(o1.getNodeId().substring(o1.getNodeId().length()-1,o1.getNodeId().length())) - Integer.parseInt(o2.getNodeId().substring(o2.getNodeId().length()-1,o2.getNodeId().length()));
}
}).collect(Collectors.toList());java的map的key转化小写
java
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("Key1", "Value1");
map.put("Key2", 123);
map.put("Key3", true);
Map<String, Object> lowerCaseMap = new HashMap<>();
map.forEach((key, value) -> lowerCaseMap.put(key.toLowerCase(), value));
System.out.println(lowerCaseMap);
}
}构建项目
启动时候打印端口
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
@SpringBootApplication
public class WikiApplication {
private static final Logger LOG = LoggerFactory.getLogger(WikiApplication.class);
public static void main(String[] args) {
SpringApplication app = new SpringApplication(WikiApplication.class);
Environment env = app.run(args).getEnvironment();
LOG.info("启动成功!!");
LOG.info("地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
}
}使用mapper和xml在一个文件夹
xml
pom.xml
<build>
//这个是方便参考
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
//这个是重要的
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>工具类
大写一二三转换数字
java
import java.security.InvalidParameterException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChineseToNumeric {
//读音与汉字对应的表
private static final Map<Character, Integer> Arab2Chinese = new HashMap<Character, Integer>() {
{
put('零', 0);
put('一', 1);
put('二', 2);
put('三', 3);
put('四', 4);
put('五', 5);
put('六', 6);
put('七', 7);
put('八', 8);
put('九', 9);
put('十', 10);
}
};
/**
* 单位对应数量级的表
*/
private static final Map<Character, Integer> UnitMap = new HashMap<Character, Integer>() {
{
put('十', 10);
put('百', 100);
put('千', 1000);
put('万', 10000);
put('亿', 10000 * 10000);
}
};
//正则提取
private static Pattern pattern = Pattern.compile("[零一二三四五六七八九十]?[十百千万亿]?");
/**
* 处理思路:
* <p>
* 可能的类型:
* 一千三百万 130000000
* 十一 11
* 一万 10000
* 一百二十五 125
* <p>
* 通过正则将字符串处理为 数字+单位的情况
* 然后处理的时候通过数字*单位+数字*单位...得到最后结果
*
* @param chinese 汉字输入,比如一千三百二十八
* @return 阿拉伯输入,比如 1328
*/
public static Integer Chinese2Arab(String chinese) {
Objects.requireNonNull(chinese);
//判断参数合法性
if (!pattern.matcher(chinese).replaceAll("").trim().equals("")) {
throw new InvalidParameterException();
}
Integer result = 0;
Matcher matcher = pattern.matcher(chinese);
//正则提取所有数字
while (matcher.find()) {
String res = matcher.group(0);
if (res.length() == 2) {
result += Arab2Chinese.get(res.charAt(0)) * UnitMap.get(res.charAt(1));
} else if (res.length() == 1) {
//处理三十、一百万的情况
if (UnitMap.containsKey(res.charAt(0))) {
result *= UnitMap.get(res.charAt(0));
} else if (Arab2Chinese.containsKey(res.charAt(0))) {
result += Arab2Chinese.get(res.charAt(0));
}
}
}
return result;
}
}封装项目
1.返回两种方式,属性值都封装成一样。mybatis-plus 和mybatis
2.封装控制台SQL打印
3.