Skip to content

jdk8

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

image-20220904110812324

位置 G:\安装包

image-20220904110945780

jdk安装

sh
tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local 
mv jdk1.8.0_341/ jdk8

java 适合在 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 mkfontscale

jar启动命令

Windos

java
java -jar springboot.jar --server.port=8181 --spring.profiles.active=dev

Linux

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>

第三步

请求后才能看到效果

image-20221006083019983

读取日志

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如图

image-20230515174652267

点击1.bat 生成如图

image-20230515174729853

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.

学习使我快乐吗?