diff --git a/404.html b/404.html index e9540a63e..1613fca3b 100644 --- a/404.html +++ b/404.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:32' + postUpdate: '2024-04-02 11:00:29' }
文章总览 - 15
2023
IDEA常用快捷键
IDEA常用快捷键
FinalShell激活教程
FinalShell激活教程
Blog
Blog
Java学习路线
Java学习路线
任务进度
任务进度
\ No newline at end of file diff --git a/archives/2023/04/index.html b/archives/2023/04/index.html index 0401106fc..4d0d7c779 100644 --- a/archives/2023/04/index.html +++ b/archives/2023/04/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
\ No newline at end of file diff --git a/archives/2023/page/8/index.html b/archives/2023/page/8/index.html deleted file mode 100644 index 8ef62b264..000000000 --- a/archives/2023/page/8/index.html +++ /dev/null @@ -1,213 +0,0 @@ -2023 | The Blog - - - - - - - - - -
文章总览 - 72
2023
Java学习路线
Java学习路线
任务进度
任务进度
\ No newline at end of file diff --git a/archives/2024/01/index.html b/archives/2024/01/index.html index f61bd3f51..5b54c0162 100644 --- a/archives/2024/01/index.html +++ b/archives/2024/01/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
文章总览 - 77
2023
常用类及其方法
常用类及其方法
常用正则表达式大全
常用正则表达式大全
IDEA常用快捷键
IDEA常用快捷键
FinalShell激活教程
FinalShell激活教程
Blog
Blog
Java学习路线
Java学习路线
任务进度
任务进度
\ No newline at end of file diff --git a/baidusitemap.xml b/baidusitemap.xml index ec996d058..8daed2731 100644 --- a/baidusitemap.xml +++ b/baidusitemap.xml @@ -1,8 +1,36 @@ + + https://jasonsgong.gitee.io/posts/14438.html + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/18459.html + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/63724.html + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/40445.html + 2024-04-02 + https://jasonsgong.gitee.io/posts/24183.html - 2024-03-29 + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/26768.html + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/46317.html + 2024-04-02 + + + https://jasonsgong.gitee.io/posts/29985.html + 2024-04-02 https://jasonsgong.gitee.io/posts/32696.html @@ -12,14 +40,6 @@ https://jasonsgong.gitee.io/posts/5293.html 2024-02-03 - - https://jasonsgong.gitee.io/posts/200.html - 2024-01-19 - - - https://jasonsgong.gitee.io/posts/26357.html - 2024-01-17 - https://jasonsgong.gitee.io/posts/40733.html 2024-01-13 @@ -72,18 +92,6 @@ https://jasonsgong.gitee.io/posts/46054.html 2023-11-30 - - https://jasonsgong.gitee.io/posts/53769.html - 2023-11-30 - - - https://jasonsgong.gitee.io/posts/3269.html - 2023-11-30 - - - https://jasonsgong.gitee.io/posts/63587.html - 2023-11-30 - https://jasonsgong.gitee.io/posts/50465.html 2023-11-30 @@ -100,10 +108,6 @@ https://jasonsgong.gitee.io/posts/39654.html 2023-10-22 - - https://jasonsgong.gitee.io/posts/29985.html - 2023-09-26 - https://jasonsgong.gitee.io/posts/29250.html 2023-09-23 @@ -112,36 +116,12 @@ https://jasonsgong.gitee.io/posts/62439.html 2023-09-23 - - https://jasonsgong.gitee.io/posts/25154.html - 2023-09-19 - - - https://jasonsgong.gitee.io/posts/29367.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/22654.html - 2023-09-11 - https://jasonsgong.gitee.io/posts/50908.html 2023-09-11 - https://jasonsgong.gitee.io/posts/53306.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/18459.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/21883.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/26768.html + https://jasonsgong.gitee.io/posts/29367.html 2023-09-11 @@ -153,19 +133,11 @@ 2023-09-11 - https://jasonsgong.gitee.io/posts/24637.html + https://jasonsgong.gitee.io/posts/21883.html 2023-09-11 - https://jasonsgong.gitee.io/posts/48020.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/73.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/24606.html + https://jasonsgong.gitee.io/posts/22654.html 2023-09-11 @@ -173,55 +145,23 @@ 2023-09-11 - https://jasonsgong.gitee.io/posts/63724.html + https://jasonsgong.gitee.io/posts/24606.html 2023-09-11 - https://jasonsgong.gitee.io/posts/30127.html + https://jasonsgong.gitee.io/posts/53306.html 2023-09-11 - https://jasonsgong.gitee.io/posts/36397.html + https://jasonsgong.gitee.io/posts/73.html 2023-09-11 - https://jasonsgong.gitee.io/posts/60684.html + https://jasonsgong.gitee.io/posts/56742.html 2023-09-11 - https://jasonsgong.gitee.io/posts/54835.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/63333.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/13579.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/432.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/14438.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/855.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/45572.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/12929.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/13813.html + https://jasonsgong.gitee.io/posts/32246.html 2023-09-11 @@ -233,7 +173,27 @@ 2023-09-11 - https://jasonsgong.gitee.io/posts/32246.html + https://jasonsgong.gitee.io/posts/855.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/12929.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/13813.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/54835.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/60684.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/30127.html 2023-09-11 @@ -241,11 +201,11 @@ 2023-09-11 - https://jasonsgong.gitee.io/posts/56742.html + https://jasonsgong.gitee.io/posts/432.html 2023-09-11 - https://jasonsgong.gitee.io/posts/60780.html + https://jasonsgong.gitee.io/posts/13579.html 2023-09-11 @@ -253,17 +213,21 @@ 2023-09-11 - https://jasonsgong.gitee.io/posts/32679.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/28687.html + https://jasonsgong.gitee.io/posts/36397.html 2023-09-11 https://jasonsgong.gitee.io/posts/47003.html 2023-09-11 + + https://jasonsgong.gitee.io/posts/63333.html + 2023-09-11 + + + https://jasonsgong.gitee.io/posts/45572.html + 2023-09-11 + https://jasonsgong.gitee.io/posts/35630.html 2023-09-11 @@ -272,40 +236,20 @@ https://jasonsgong.gitee.io/posts/27166.html 2023-09-11 - - https://jasonsgong.gitee.io/posts/45726.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/46317.html - 2023-09-11 - https://jasonsgong.gitee.io/posts/31385.html 2023-09-11 - - https://jasonsgong.gitee.io/posts/3661.html - 2023-09-11 - - - https://jasonsgong.gitee.io/posts/22202.html - 2023-09-11 - https://jasonsgong.gitee.io/posts/6319.html 2023-09-11 - - https://jasonsgong.gitee.io/posts/46306.html - 2023-09-11 - https://jasonsgong.gitee.io/posts/11844.html 2023-09-11 - https://jasonsgong.gitee.io/posts/40445.html + https://jasonsgong.gitee.io/posts/45726.html 2023-09-11 \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index a8a594920..3afaf4b41 100644 --- a/categories/index.html +++ b/categories/index.html @@ -5,12 +5,12 @@ - + -
分类 - 后端
2023
常用类及其方法
常用类及其方法
常用正则表达式大全
常用正则表达式大全
IDEA常用快捷键
IDEA常用快捷键
FinalShell激活教程
FinalShell激活教程
Java学习路线
Java学习路线
\ No newline at end of file diff --git a/categories/大数据/index.html b/categories/大数据/index.html index f2d80f885..17363f59d 100644 --- a/categories/大数据/index.html +++ b/categories/大数据/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:34' + postUpdate: '2024-04-02 11:00:30' }
常用类及其方法
常用正则表达式大全
IDEA常用快捷键
FinalShell激活教程
Blog
Java学习路线
任务进度
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
\ No newline at end of file diff --git a/pdf/Java8实战.pdf b/pdf/Java8实战.pdf deleted file mode 100644 index 76790cc39..000000000 Binary files a/pdf/Java8实战.pdf and /dev/null differ diff --git a/pdf/Linux命令行与shell脚本编程大全.pdf b/pdf/Linux命令行与shell脚本编程大全.pdf deleted file mode 100644 index 321643970..000000000 Binary files a/pdf/Linux命令行与shell脚本编程大全.pdf and /dev/null differ diff --git a/pdf/MySQL面试题-参考回答.pdf b/pdf/MySQL面试题-参考回答.pdf deleted file mode 100644 index d53f0043a..000000000 Binary files a/pdf/MySQL面试题-参考回答.pdf and /dev/null differ diff --git a/pdf/Redis面试题-参考回答.pdf b/pdf/Redis面试题-参考回答.pdf deleted file mode 100644 index 7171f6c41..000000000 Binary files a/pdf/Redis面试题-参考回答.pdf and /dev/null differ diff --git a/pdf/微服务面试题-参考回答.pdf b/pdf/微服务面试题-参考回答.pdf deleted file mode 100644 index a9b3fb37c..000000000 Binary files a/pdf/微服务面试题-参考回答.pdf and /dev/null differ diff --git a/pdf/框架篇面试题-参考回答.pdf b/pdf/框架篇面试题-参考回答.pdf deleted file mode 100644 index 8482ed225..000000000 Binary files a/pdf/框架篇面试题-参考回答.pdf and /dev/null differ diff --git a/pdf/消息中间件面试题-参考回答.pdf b/pdf/消息中间件面试题-参考回答.pdf deleted file mode 100644 index b24752e72..000000000 Binary files a/pdf/消息中间件面试题-参考回答.pdf and /dev/null differ diff --git a/pdf/精通Linux.第2版.pdf b/pdf/精通Linux.第2版.pdf deleted file mode 100644 index caae42d41..000000000 Binary files a/pdf/精通Linux.第2版.pdf and /dev/null differ diff --git a/pdf/韩顺平_循序渐进学Java零基础【完整笔记】.pdf b/pdf/韩顺平_循序渐进学Java零基础【完整笔记】.pdf deleted file mode 100644 index 3f7f59766..000000000 Binary files a/pdf/韩顺平_循序渐进学Java零基础【完整笔记】.pdf and /dev/null differ diff --git a/pictures/20230321180350.png b/pictures/20230321180350.png deleted file mode 100644 index 802882125..000000000 Binary files a/pictures/20230321180350.png and /dev/null differ diff --git a/pictures/20230321180405.png b/pictures/20230321180405.png deleted file mode 100644 index ad7e14f9b..000000000 Binary files a/pictures/20230321180405.png and /dev/null differ diff --git a/pictures/20230321180420.png b/pictures/20230321180420.png deleted file mode 100644 index 619f4909e..000000000 Binary files a/pictures/20230321180420.png and /dev/null differ diff --git a/pictures/image-20230513134435330.png b/pictures/image-20230513134435330.png deleted file mode 100644 index d2e4d0a6b..000000000 Binary files a/pictures/image-20230513134435330.png and /dev/null differ diff --git a/pictures/image-20230609220809366.png b/pictures/image-20230609220809366.png deleted file mode 100644 index d5eb21387..000000000 Binary files a/pictures/image-20230609220809366.png and /dev/null differ diff --git a/pictures/image-20230609221040152.png b/pictures/image-20230609221040152.png deleted file mode 100644 index 68564aff2..000000000 Binary files a/pictures/image-20230609221040152.png and /dev/null differ diff --git a/pictures/image-20230919221346055.png b/pictures/image-20230919221346055.png deleted file mode 100644 index 658c6c8b0..000000000 Binary files a/pictures/image-20230919221346055.png and /dev/null differ diff --git a/pictures/image-20230919221906997.png b/pictures/image-20230919221906997.png deleted file mode 100644 index 51c1d8fa0..000000000 Binary files a/pictures/image-20230919221906997.png and /dev/null differ diff --git a/pictures/image-20230919222258965.png b/pictures/image-20230919222258965.png deleted file mode 100644 index 7cc6ff74e..000000000 Binary files a/pictures/image-20230919222258965.png and /dev/null differ diff --git a/pictures/image-20230919224644515.png b/pictures/image-20230919224644515.png deleted file mode 100644 index 8d1d35b54..000000000 Binary files a/pictures/image-20230919224644515.png and /dev/null differ diff --git a/pictures/image-20230920100712177.png b/pictures/image-20230920100712177.png deleted file mode 100644 index 48285331e..000000000 Binary files a/pictures/image-20230920100712177.png and /dev/null differ diff --git a/pictures/image-20230920101220932.png b/pictures/image-20230920101220932.png deleted file mode 100644 index f0177e8a9..000000000 Binary files a/pictures/image-20230920101220932.png and /dev/null differ diff --git a/pictures/image-20230920101719542.png b/pictures/image-20230920101719542.png deleted file mode 100644 index 6c109ae00..000000000 Binary files a/pictures/image-20230920101719542.png and /dev/null differ diff --git a/pictures/image-20230920112553412.png b/pictures/image-20230920112553412.png deleted file mode 100644 index 7266731e7..000000000 Binary files a/pictures/image-20230920112553412.png and /dev/null differ diff --git a/pictures/image-20230920112730660.png b/pictures/image-20230920112730660.png deleted file mode 100644 index e51345803..000000000 Binary files a/pictures/image-20230920112730660.png and /dev/null differ diff --git a/pictures/image-20231026230517798.png b/pictures/image-20231026230517798.png deleted file mode 100644 index ea8195ce5..000000000 Binary files a/pictures/image-20231026230517798.png and /dev/null differ diff --git a/pictures/image-20231026230731303.png b/pictures/image-20231026230731303.png deleted file mode 100644 index 37237278d..000000000 Binary files a/pictures/image-20231026230731303.png and /dev/null differ diff --git a/pictures/image-20231026231100441.png b/pictures/image-20231026231100441.png deleted file mode 100644 index f725813b3..000000000 Binary files a/pictures/image-20231026231100441.png and /dev/null differ diff --git a/pictures/image-20240117133754650.png b/pictures/image-20240117133754650.png deleted file mode 100644 index 3e9566174..000000000 Binary files a/pictures/image-20240117133754650.png and /dev/null differ diff --git a/pictures/image-20240117133926234.png b/pictures/image-20240117133926234.png deleted file mode 100644 index 8e5d3b61e..000000000 Binary files a/pictures/image-20240117133926234.png and /dev/null differ diff --git a/pictures/image-20240117134006588.png b/pictures/image-20240117134006588.png deleted file mode 100644 index b2567d149..000000000 Binary files a/pictures/image-20240117134006588.png and /dev/null differ diff --git a/pictures/image-20240117134330775.png b/pictures/image-20240117134330775.png deleted file mode 100644 index 6394e0960..000000000 Binary files a/pictures/image-20240117134330775.png and /dev/null differ diff --git a/pictures/image-20240117134513131.png b/pictures/image-20240117134513131.png deleted file mode 100644 index d643ce32c..000000000 Binary files a/pictures/image-20240117134513131.png and /dev/null differ diff --git a/pictures/image-20240117134606694.png b/pictures/image-20240117134606694.png deleted file mode 100644 index 772fcfa23..000000000 Binary files a/pictures/image-20240117134606694.png and /dev/null differ diff --git a/pictures/image-20240117134641037.png b/pictures/image-20240117134641037.png deleted file mode 100644 index 22a863822..000000000 Binary files a/pictures/image-20240117134641037.png and /dev/null differ diff --git a/pictures/image-20240117134706682.png b/pictures/image-20240117134706682.png deleted file mode 100644 index 652d53321..000000000 Binary files a/pictures/image-20240117134706682.png and /dev/null differ diff --git a/pictures/image-20240117134808373.png b/pictures/image-20240117134808373.png deleted file mode 100644 index f8279292c..000000000 Binary files a/pictures/image-20240117134808373.png and /dev/null differ diff --git a/pictures/image-20240117161929655.png b/pictures/image-20240117161929655.png deleted file mode 100644 index 5bcda76c3..000000000 Binary files a/pictures/image-20240117161929655.png and /dev/null differ diff --git a/pictures/image-20240117162126397.png b/pictures/image-20240117162126397.png deleted file mode 100644 index bf36eda64..000000000 Binary files a/pictures/image-20240117162126397.png and /dev/null differ diff --git a/posts/11844.html b/posts/11844.html index b54f98368..3dd01b2bf 100644 --- a/posts/11844.html +++ b/posts/11844.html @@ -5,13 +5,13 @@ - + -

验证码服务

1.使用邮件发送验证码

1.1 引入依赖

坑点:有时候遇到验证码发不出去的情况,要调整依赖的版本,更新为高版本的依赖

+ })(window)

验证码服务

1.使用邮件发送验证码

1.1 引入依赖

坑点:有时候遇到验证码发不出去的情况,要调整依赖的版本,更新为高版本的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--javaMail-->
<dependencies>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
@@ -206,7 +206,7 @@

2.使用阿里云的短信服务

阿里云的短信服务不面向个人用户,无法使用,但是使用的基本逻辑和使用邮箱类似

3.Token字符串生成的工具类(JWT)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.atguigu.commonutils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
* @author helen
* @since 2019/10/16
*/
public class JwtUtils {

/**
* 设置token的过期时间
*/
public static final long EXPIRE = 1000 * 60 * 60 * 24;
/**
* 密钥
*/
public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";


/**
* 生成token字符串
*/
public static String getJwtToken(String id, String nickname){

String JwtToken = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.setSubject("guli-user")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.claim("id", id)
.claim("nickname", nickname)
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();

return JwtToken;
}

/**
* 判断token是否存在与有效
*/
public static boolean checkToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 判断token是否存在与有效
*/
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 根据token获取会员id
*/
public static String getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return "";
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
return (String)claims.get("id");
}
}

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论

特殊符号大全

中文字符

零壹贰叁肆伍陆柒捌玖拾佰仟万亿吉太拍艾分厘毫微卍卐卄巜弍弎弐朤氺曱甴囍兀々〆のぁ〡〢〣〤〥〦〧〨〩㊎㊍㊌㊋㊏㊚㊛㊐㊊㊣㊤㊥㊦㊧㊨㊒㊫㊑㊓㊔㊕㊖㊗㊘㊜㊝㊞㊟㊠㊡㊢㊩㊪㊬㊭㊮㊯㊰㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉

+ })(window)

特殊符号大全

中文字符

零壹贰叁肆伍陆柒捌玖拾佰仟万亿吉太拍艾分厘毫微卍卐卄巜弍弎弐朤氺曱甴囍兀々〆のぁ〡〢〣〤〥〦〧〨〩㊎㊍㊌㊋㊏㊚㊛㊐㊊㊣㊤㊥㊦㊧㊨㊒㊫㊑㊓㊔㊕㊖㊗㊘㊜㊝㊞㊟㊠㊡㊢㊩㊪㊬㊭㊮㊯㊰㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉

常用特殊符号

❤❥웃유♋☮✌☏☢☠✔☑♚▲♪✈✞÷↑↓◆◇⊙■□△▽¿─│♥❣♂♀☿Ⓐ✍✉☣☤✘☒♛▼♫⌘☪≈←→◈◎☉★☆⊿※¡━┃♡ღツ☼☁❅♒✎©®™Σ✪✯☭➳卐√↖↗●◐Θ◤◥︻〖〗┄┆℃℉°✿ϟ☃☂✄¢€£∞✫★½✡×↙↘○◑⊕◣◢︼【】┅┇☽☾✚〓▂▃▄▅▆▇█▉▊▋▌▍▎▏↔↕☽☾の•▸◂▴▾┈┊①②③④⑤⑥⑦⑧⑨⑩ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍿▓♨♛❖♓☪✙┉┋☹☺☻تヅツッシÜϡﭢ™℠℗©®♥❤❥❣❦❧♡۵웃유ღ♋♂♀☿☼☀☁☂☄☾☽❄☃☈⊙☉℃℉❅✺ϟ☇♤♧♡♢♠♣♥♦☜☞☝✍☚☛☟✌✽✾✿❁❃❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴✵✶✷✸✹✺✻✼❄❅❆❇❈❉❊†☨✞✝☥☦☓☩☯☧☬☸✡♁✙♆。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑•¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼☩☨☦✞✛✜✝✙✠✚†‡◉○◌◍◎●◐◑◒◓◔◕◖◗❂☢⊗⊙◘◙◍⅟½⅓⅕⅙⅛⅔⅖⅚⅜¾⅗⅝⅞⅘≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩⊰⊱⋛⋚∫∬∭∮∯∰∱∲∳%℅‰‱㊣㊎㊍㊌㊋㊏㊐㊊㊚㊛㊤㊥㊦㊧㊨㊒㊞㊑㊒㊓㊔㊕㊖㊗㊘㊜㊝㊟㊠㊡㊢㊩㊪㊫㊬㊭㊮㊯㊰㊙㉿囍♔♕♖♗♘♙♚♛♜♝♞♟ℂℍℕℙℚℝℤℬℰℯℱℊℋℎℐℒℓℳℴ℘ℛℭ℮ℌℑℜℨ♪♫♩♬♭♮♯°øⒶ☮✌☪✡☭✯卐✐✎✏✑✒✍✉✁✂✃✄✆✉☎☏➟➡➢➣➤➥➦➧➨➚➘➙➛➜➝➞➸♐➲➳⏎➴➵➶➷➸➹➺➻➼➽←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨➫➬➩➪➭➮➯➱↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬◤◥◄►▶◀◣◢▲▼◥▸◂▴▾△▽▷◁⊿▻◅▵▿▹◃❏❐❑❒▀▁▂▃▄▅▆▇▉▊▋█▌▍▎▏▐░▒▓▔▕■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍘☰☲☱☴☵☶☳☷☯

十二星座符号

@@ -240,7 +240,7 @@

表情符号

😀😁😂😃😄😅😆😉😊😋😎😍😘😗😙😚☺😇😐😑😶😏😣😥😮😯😪😫😴😌😛😜😝😒😓😔😕😲😷😖😞😟😤😢😭😦😧😨😬😰😱😳😵😡😠😈👿👹👺💀👻👽👦👧👨👩👴👵👶👱👮👲👳👷👸💂🎅👰👼💆💇🙍🙎🙅🙆💁🙋🙇🙌🙏👤👥🚶🏃👯💃👫👬👭💏💑👪💪👈👉☝👆👇✌✋👌👍👎✊👊👋👏👐✍👣👀👂👃👅👄💋👓👔👕👖👗👘👙👚👛👜👝🎒💼👞👟👠👡👢👑👒🎩🎓💄💅💍🌂🙈🙉🙊🐵🐒🐶🐕🐩🐺🐱😺😸😹😻😼😽🙀😿😾🐈🐯🐅🐆🐴🐎🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🐘🐭🐁🐀🐹🐰🐇🐻🐨🐼🐾🐔🐓🐣🐤🐥🐦🐧🐸🐊🐢🐍🐲🐉🐳🐋🐬🐟🐠🐡🐙🐚🐌🐛🐜🐝🐞🦋💐🌸💮🌹🌺🌻🌼🌷🌱🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜☀🌝🌞⭐🌟🌠☁⛅☔⚡❄🔥💧🌊💩🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍅🍆🌽🍄🌰🍞🍖🍗🍔🍟🍕🍳🍲🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🍡🍦🍧🍨🍩🍪🎂🍰🍫🍬🍭🍮🍯🍼☕🍵🍶🍷🍸🍹🍺🍻🍴🎪🎭🎨🎰🚣🛀🎫🏆⚽⚾🏀🏈🏉🎾🎱🎳⛳🎣🎽🎿🏂🏄🏇🏊🚴🚵🎯🎮🎲🎷🎸🎺🎻🎬👾🌋🗻🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪⛲🌁🌃🌆🌇🌉🌌🎠🎡🎢🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚤🚢✈💺🚁🚟🚠🚡🚀🎑🗿🛂🛃🛄🛅💌💎🔪💈🚪🚽🚿🛁⌛⏳⌚⏰🎈🎉🎊🎎🎏🎐🎀🎁📯📻📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡💡🔦🏮📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💰💴💵💶💷💸💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑🔨🔫🔧🔩🔗💉💊🚬🔮🚩🎌💦💨💣☠♠♥♦♣🀄🎴🔇🔈🔉🔊📢📣💤💢💬💭♨🌀🔔🔕✡✝🔯📛🔰🔱⭕✅☑✔✖❌❎➕➖➗➰➿〽✳✴❇‼⁉❓❔❕❗©®™🎦🔅🔆💯🔠🔡🔢🔣🔤🅰🆎🅱🆑🆒🆓ℹ🆔Ⓜ🆕🆖🅾🆗🅿🆘🆙🆚🈁🈂🈷🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳㊗㊙🈺🈵▪▫◻◼◽◾⬛⬜🔶🔷🔸🔹🔺🔻💠🔲🔳⚪⚫🔴🔵♈♉♊♋♌♍♎♏♐♑♒♓⛎💘❤💓💔💕💖💗💙💚💛💜💝💞💟❣🌿🚧💒☎📟💽⬆↗➡↘⬇↙⬅↖↕↔↩↪⤴⤵🔃🔄🔙🔚🔛🔜🔝🔀🔁🔂▶⏩◀⏪🔼⏫🔽⏬📱📶📳📴♻🏧🚮🚰♿🚹🚺🚻🚼🚾⚠🚸⛔🚫🚳🚭🚯🚱🚷🔞

汉语字典为您提供特殊符号大全,网名符号,特殊符号☎☏✄☪☣☢☠♨« »큐〓㊚㊛囍㊒㊖☑✔☐☒✘㍿☯☰☷♥♠♤❤♂♀★☆☯✡※卍卐■□◆◇▲△▂▃▄▅▆▇█●○◎⊕⊙㊣↑↓←→↖↗↘↙㎡№§※≡✿ⓛⓞⓥⓔ∞∑√øπ×÷±∫∵∴⊥∥∠€¥℃™©®①❶㊀㈠⑴⒈Ⓐⓐ⒜

转载于: https://shijianchuo.net/tesufuhao

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论

SpringBoot整合MongoDB

1.介绍

​ MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

+ })(window)

SpringBoot整合MongoDB

1.介绍

​ MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

适用场景
1、网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由M ongo搭建的持久化缓存层可以避免下层的数据源过载。
3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往会选择传统的文件进行存储。
4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对Map Reduce弓摩的内置支持。
5、用于对象及 JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储 及查询。
不适用场合
1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

中文文档:https://docs.mongoing.com/

2.入门

​ spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足

@@ -217,7 +217,7 @@ -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论

力扣(LeetCode)算法刷题

刷题网站: 力扣 视频: AcWing

+ })(window)

力扣(LeetCode)算法刷题

刷题网站: 力扣 视频: AcWing

一.数组

A.简单

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例 1:

1
2
3
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
@@ -262,7 +262,7 @@ -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

SpringBoot整合Redis

1.Redis的介绍

​ Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

+ })(window)

SpringBoot整合Redis

1.Redis的介绍

​ Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

中文文档:https://www.redis.net.cn/

2.入门

2.1 引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
@@ -283,7 +283,7 @@

key的生成规则如下图:

image-20230414152035347

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

压力测试与性能监控

一.压力测试

性能指标

+ })(window)

压力测试与性能监控

一.压力测试

性能指标

  • 响应时间(Response Time: RT)响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。

  • @@ -277,7 +277,7 @@

    安装成功之后显示如下

    image-20230709160932416

    image-20230709170626946

    -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

常用bat和shell脚本

-

BAT脚本,即批处理脚本,是Microsoft Windows操作系统下一种简单的脚本编程形式。它主要用于自动化一系列命令行操作,通过编写一个文本文件,并将其扩展名设置为.bat.cmd,用户可以创建一个批处理程序。当双击运行这样一个批处理文件时,操作系统会按照文件中逐行定义的顺序依次执行其中包含的命令。

-
-
-

Shell脚本是一种在类Unix操作系统(如Linux、macOS)中使用的脚本编程形式,它是基于特定的Shell解释器(如Bash、Zsh、Ksh等)来编写的纯文本文件。Shell脚本通常具有.sh扩展名,通过在脚本开头声明指定的Shell类型(如#!/bin/bash),确保系统知道应使用哪种Shell来解释和执行该脚本。

-
-

一.博客自动化脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
@echo off


REM 设置Hexo项目目录路径
REM set "HEXO_DIR=C:\Blog\blog"
REM 切换到Hexo项目目录
REM cd /d "%HEXO_DIR%"

REM 如果当前脚本所在的目录就是hexo的根目录,可以直接使用下面的方式,不用再修改项目的路径信息
REM 切换到当前脚本所在的目录
cd /d %~dp0

REM 个性化提示信息
echo 网站:jasonsgong.gitee.io 作者:Jason Gong 版本:4.9.0
echo.
echo 1.部署
echo 2.启动本地服务
echo 3.创建新文章
echo.

:input
set /p "choice=请输入数字: "

REM 1表示部署操作
if "%choice%" == "1" (
echo 正在执行清理、生成与部署中
REM 执行清理、生成和部署操作
hexo clean
if errorlevel 1 (
echo Error occurred during hexo clean.
REM 延迟5秒关闭窗口
timeout /t 5 /nobreak > nul
goto :eof
)
hexo generate
if errorlevel 1 (
echo Error occurred during hexo generate.
REM 延迟5秒关闭窗口
timeout /t 5 /nobreak > nul
goto :eof
)
hexo deploy
REM 打开指定的URL链接
start https://gitee.com/JasonsGong/jasonsgong/pages
REM 给出提示
echo Operation completed successfully!
REM 延迟5秒关闭窗口
timeout /t 5 /nobreak > nul
goto :end

REM 2表示本地预览
) else if "%choice%" == "2" (
echo 正在执行清理、生成与本地预览中
REM 执行清理、生成与本地预览
hexo clean
if errorlevel 1 (
echo Error occurred during hexo clean.
REM 延迟5秒关闭窗口
timeout /t 5 /nobreak > nul
goto :eof
)
hexo generate
if errorlevel 1 (
echo Error occurred during hexo generate.
REM 延迟5秒关闭窗口
timeout /t 5 /nobreak > nul
goto :eof
)
REM 打开指定的URL链接
start http://localhost:4000/
hexo server
REM 给出提示
echo Operation exit successfully!
REM 延迟2秒关闭窗口
timeout /t 2 /nobreak > nul
goto :end

REM 3表示创建文章
) else if "%choice%" == "3" (
setlocal enabledelayedexpansion
:inputArticleName
set /p "articleName=请输入文章名称: "
:inputIsConfirm
set /p "confirm=是否创建名为 !articleName! 的新文章?[Y/N]: "
if /i "!confirm!" equ "Y" (
echo 正在创建文章中
REM 执行创建文章的命令
hexo n !articleName!
echo Operation completed successfully!
REM 延迟3秒后关闭窗口(如果需要的话)
timeout /t 3 /nobreak > nul
goto :eof
) else if /i "!confirm!" equ "N" (
echo 操作取消,请重新输入文章名称!
goto :inputArticleName
) else (
echo 输入无效,请输入Y或N!
goto :inputIsConfirm
)
endlocal
) else (
echo 输入无效,请输入指定数字!
goto :input
)

:end
pause
- -

二.Java项目部署脚本

-

使用教程:

-

1.修改基础目录BASIC_DIR和jar包名APP_JAR的值

-

2.在基础目录下创建一个bin目录,把该脚本放在bin目录中

-

3.在基础目录中创建一个target目录,把jar包放在target目录中

-

4.使用deploy.sh start[stop] 启动[停止]项目

-

Tips: 如果在执行脚本过程中出现^M报错,可以使用下面的命令将windows的换行符替换成linux的换行符号

-
1
2
3
>#通过下面的命令将windows的换行符替换成linux的换行符号
># xxx.sh替换成当前的脚本名
>sed -i 's/\r$//' xxx.sh
-
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
#更新当前依赖的环境变量
source /etc/profile

# 定义常量
#基础目录
BASIC_DIR="/home/ruoyi/back"
#jar包名
APP_JAR="ruoyi-admin.jar"
#以下内容不需要修改
LOG_DIR="$BASIC_DIR/logs"
DATE=$(date +%Y-%m-%d)
LOG_FILE="$LOG_DIR/application-$DATE.log"
PID_FILE="$BASIC_DIR/run/app.pid"
JAVA_CMD="java -jar $BASIC_DIR/target/$APP_JAR"

# 创建日志目录(如果不存在)
if [ ! -d "$LOG_DIR" ]; then
mkdir -p $LOG_DIR
fi

# 检查并创建PID文件所在的目录
if [ ! -d "$(dirname "$PID_FILE")" ]; then
mkdir -p "$(dirname "$PID_FILE")"
fi

start() {
# 检查进程是否已启动
if [ -f "$PID_FILE" ]; then
pid=$(cat $PID_FILE)
if kill -0 $pid > /dev/null 2>&1; then
echo "The application is already running with PID: $pid"
echo "Killing the existing process and restarting..."
kill $pid
sleep 5 # 等待旧进程完全退出
else
echo "The PID file exists but no matching process was found."
fi
fi

# 启动应用并记录PID
nohup $JAVA_CMD > $LOG_FILE 2>&1 &
pid=$!
echo $pid > $PID_FILE
echo "Application has successfully started. Logs are being saved to: $LOG_FILE"
}

stop() {
if [ -f "$PID_FILE" ]; then
pid=$(cat $PID_FILE)
if kill -0 $pid > /dev/null 2>&1; then
echo "Stopping the application with PID: $pid"
kill $pid
rm -f $PID_FILE
echo "Application stopped."
else
echo "The PID file exists but no matching process was found."
fi
else
echo "The application is not currently running."
fi
}

# 判断用户输入的参数
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

exit 0
- -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
\ No newline at end of file diff --git a/posts/20683.html b/posts/20683.html index 409902c08..f0c7e87d8 100644 --- a/posts/20683.html +++ b/posts/20683.html @@ -5,14 +5,14 @@ - + - + -

Linux中开发环境的搭建

一.Linux操作系统的安装与配置

软件:VMware 、Linux镜像文件
VMWare虚拟机安装Linux教程 | The Blog (gitee.io)

+ })(window)

Linux中开发环境的搭建

一.Linux操作系统的安装与配置

软件:VMware 、Linux镜像文件
VMWare虚拟机安装Linux教程 | The Blog (gitee.io)

二.配置Java环境

2.1.删除自带的JDK

1
2
3
4
5
6
#查看系统是否有java环境
java -version
# 查找Linux中已有的java环境的相关文件
rpm -qa |grep java
# 执行命令 删除上面的java文件
rpm -e --nodeps +上面查找出来的文件
@@ -245,7 +245,7 @@

测试访问:http://虚拟机ip:8848/nacos

image-20230811105925843

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论

Linux设置静态IP

1.查看IP的状态

1
2
#查看是否为静态ip
ip addr
+ })(window)

Linux设置静态IP

1.查看IP的状态

1
2
#查看是否为静态ip
ip addr

如图所示的是动态IP,我们要配置静态IP

image-20230511230406172

@@ -204,7 +204,7 @@

image-20230511234154523

虚拟机ping外部也可以ping通

image-20230511235621228

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

细节知识

Linux开启/关闭防火墙的命令

-
1
2
3
4
5
6
7
8
9
10
# 检查防火墙状态:
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 关闭防火墙(有时间限制)
systemctl stop firewalld
# 设置开机禁用防火墙(先执行上面一条命令之后执行此命令,即可永久关闭)
systemctl disable firewalld.service
# 设置开机启用防火墙
systemctl enable firewalld.service
- - - -

windows查看端口占用情况,杀死端口的命令

-
1
2
3
4
# 查询被占用的端口号的信息
netstat -ano | findstr "8080"
#根据端口号的PID杀死该端口的进程 其中 17156 是8080端口的PID值
taskkill /pid 17156 /f
- - - -

Linux开启关闭键盘背光灯

-
1
2
3
4
5
#不是永久有效的
# 开启键盘背光灯
xset led named "Scroll Lock"
#关闭键盘背光灯
xset -led named "Scroll Lock"
- - - -

关闭Mysql的服务

-
1
2
3
4
5
6
7
8
9
10
#查找是否安装了mysql的服务
rpm -qa | grep -i mysql
#查看mysql服务的状态
service mysqld status
#关闭mysql的服务
service mysqld stop
#重启的命令
service mysqld restart
#关闭开机自启动
systemctl disable mysqld
- - - -

前端向后端传递对象数据

-

传递普通对象参数的写法

-

params: searchObj

-
1
2
3
4
5
6
7
getPageList(current,limit,searchObj){
return request({
url: `${api_name}/${current}/${limit}`,
method: 'get',
params: searchObj //使用这种方式进行传递
})
}
- -
1
2
3
4
5
6
7
8
9
10
11
@GetMapping("/{page}/{limit}")
public Result pageQueryRole(@PathVariable Long page,
@PathVariable Integer limit,
SysRoleQueryVo sysRoleQueryVo) { //普通的对象进行接收 没有添加注解

Page<SysRole> pageParam = new Page<>(page, limit);
LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(!StringUtils.isEmpty(sysRoleQueryVo.getRoleName()),SysRole::getRoleName, sysRoleQueryVo.getRoleName());
Page<SysRole> sysRolePage = sysRoleService.page(pageParam, queryWrapper);
return Result.ok(sysRolePage);
}
- -

json格式的传递

-

data: searchObj

-
1
2
3
4
5
6
7
add(sysRole){
return request({
url: `${api_name}/save`,
method: 'post',
data: sysRole //使用这种方式进行传递
})
}
- -
1
2
3
4
5
@PostMapping("/save")
public Result save(@RequestBody SysRole sysRole){ //JSON格式对象的传递 需要使用注解@RequestBody
boolean isSave = sysRoleService.save(sysRole);
return isSave? Result.ok() : Result.fail();
}
- - - -

调整日志的级别

-
1
2
3
4
logging:
level:
# 注意这里包的路径,要根据实际情况t
com.atguigu.gulimall: debug
- - - -

@JsonInclude注解

-
1
2
@JsonInclude(JsonInclude.Include.NON_EMPTY)//这里是当children为空的时候,向前端传递数据就不带这个
private List<CategoryEntity> children;
- - - -

node相关的问题

-
1
2
3
4
5
6
7
8
#查看node的版本
node -v
#查看npm的版本
npm -v
#查看npm使用的镜像源(npm镜像源)
npm get registry
#设置淘宝镜像源
npm config set registry http://registry.npm.taobao.org
- - - -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
最近更新
\ No newline at end of file diff --git a/posts/22654.html b/posts/22654.html index 297b57518..05a8e781e 100644 --- a/posts/22654.html +++ b/posts/22654.html @@ -5,13 +5,13 @@ - + -

ElasticSearch

官网: https://www.elastic.co/cn/elasticsearch/

+ })(window)

ElasticSearch

官网: https://www.elastic.co/cn/elasticsearch/

简介

​ Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。

一.基本概念

1.Index(索引)

动词:相当于mysql的insert

@@ -396,7 +396,7 @@ -
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论

Map集合的遍历

1.方法一

lambda表达式遍历

-
1
2
3
4
5
Map<String, String> map = new HashMap<String, String>();
map.forEach((key,value)->{
System.out.println(key);
System.out.println(value);
});
- - - -

1.方法二

在 for 循环中使用 entries 实现 Map 的遍历(最常见和最常用的)

-
1
2
3
4
5
6
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey + ":" + mapValue);
}
- - - -

2.方法三

使用 for-each 循环遍历 key 或者 values,一般适用于只需要 Map 中的 key 或者 value 时使用,性能上比 entrySet 好

-
1
2
3
4
5
6
7
8
9
Map<String, String> map = new HashMap<String, String>();
// 打印键集合
for (String key : map.keySet()) {
System.out.println(key);
}
// 打印值集合
for (String value : map.values()) {
System.out.println(value);
}
- - - -

3.方法四

使用迭代器(Iterator)遍历

-
1
2
3
4
5
6
7
8
Map<String, String> map = new HashMap<String, String>();
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ":" + value);
}
- - - -

4.方法五

通过键找值遍历,效率比较低,从键取值是耗时的操作

-
1
2
3
4
for(String key : map.keySet()){
String value = map.get(key);
System.out.println(key+":"+value);
}
- - - -

…….

打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
\ No newline at end of file diff --git a/posts/25154.html b/posts/25154.html deleted file mode 100644 index 5dd60cd1a..000000000 --- a/posts/25154.html +++ /dev/null @@ -1,280 +0,0 @@ -Windows10的Linux子系统WSL的安装和使用 | The Blog - - - - - - - - - - - - -

Windows10的Linux子系统WSL的安装和使用

一. WSL简介

image-20230919221346055

-

image-20230919221906997

-

二.安装教程

1.开启WSL相关功能

-

image-20230919222258965

-

2.在微软应用商店下载并安装Ubuntu

-

image-20230919224644515

-

3.下载完成后打开Ubuntu,设置用户名和密码就可以使用了,下次打开直接搜索Ubuntu这个应用,打开即可

-

用户名要小写,下面我们可以看到如果使用大写的用户名,会一直提示我们使用小写的用户名

-

image-20230920100712177

-

4.使用Windows Terminal操作Ubuntu

-

下载Windows Terminal

-

image-20230920101220932

-

使用Windows Terminal打开Ubuntu界面

-

image-20230920101719542

-

三.FinalShell连接本机Ubuntu

1.先卸载重装一遍ssh服务,这里不是很确定是不是自带ssh服务有没有问题 ,这里使用root

-
1
2
3
4
sudo -s #切换到管理员用户
apt-get remove openssh-server
apt-get install openssh-server
apt-get update #执行上面的指令出现404错误的时候可以执行一下这一条指令,然后再执行上面的命令
- -

2.编辑sshd_config文件

-
1
2
3
4
5
vim /etc/ssh/sshd_config

Port 2222 #设置ssh的端口号, 由于22在windows中有别的用处, 尽量不修改系统的端口号
PermitRootLogin yes # 可以root远程登录
PasswordAuthentication yes # 密码验证登录
- -

3.重启服务

-
1
sudo service ssh --full-restart
- -

4.使用finall连接

-

注: 用户名填写设置的用户名,端口号是2222,如果是其它的主机连接本机的ubuntu,修改主机地址即可

-

image-20230920112553412

-

5.连接成功之后

-

image-20230920112730660

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
\ No newline at end of file diff --git a/posts/26357.html b/posts/26357.html deleted file mode 100644 index 91a491693..000000000 --- a/posts/26357.html +++ /dev/null @@ -1,264 +0,0 @@ -WebSocket使用案例 | The Blog - - - - - - - - - - - - -

WebSocket使用案例

一.消息推送常见方式

image-20240117133754650

-

1.轮询和长轮询

image-20240117133926234

-

2.SSE

image-20240117134006588

-

二.WebSocket介绍

1.基本介绍

image-20240117134330775

-

2.原理解析

image-20240117134513131

-

三.WebSocket API

1.客户端API

image-20240117134606694

-

image-20240117134621131

-

2.服务端API

image-20240117134641037

-

image-20240117134706682

-

image-20240117134808373

-

四.在线聊天室实现

1.实现效果

image-20240117161929655

-

2.流程分析

image-20240117162126397

-
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
\ No newline at end of file diff --git a/posts/26768.html b/posts/26768.html index 769326ea0..9d10c642e 100644 --- a/posts/26768.html +++ b/posts/26768.html @@ -1,17 +1,17 @@ -Maven配置文件settings.xml | The Blog +Maven配置文件settings.xml | The Blog - + - + - + -

常用类及其方法

1.String类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.hspedu.string_;

/**
* @author 韩顺平
* @version 1.0
*/
public class StringMethod01 {
public static void main(String[] args) {
//1. equals 前面已经讲过了. 比较内容是否相同,区分大小写
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));//

// 2.equalsIgnoreCase 忽略大小写的判断内容是否相等
String username = "johN";
if ("john".equalsIgnoreCase(username)) {
System.out.println("Success!");
} else {
System.out.println("Failure!");
}
// 3.length 获取字符的个数,字符串的长度
System.out.println("韩顺平".length());

// 4.indexOf 获取字符在字符串对象中第一次出现的索引,索引从0开始,如果找不到,返回-1
String s1 = "wer@terwe@g";
int index = s1.indexOf('@');
System.out.println(index);// 3
System.out.println("weIndex=" + s1.indexOf("we"));//0

// 5.lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1
s1 = "wer@terwe@g@";
index = s1.lastIndexOf('@');
System.out.println(index);//11
System.out.println("ter的位置=" + s1.lastIndexOf("ter"));//4

// 6.substring 截取指定范围的子串
String name = "hello,张三";
//下面name.substring(6) 从索引6开始截取后面所有的内容
System.out.println(name.substring(6));//截取后面的字符
//name.substring(0,5)表示从索引0开始截取,截取到索引 5-1=4位置
System.out.println(name.substring(2,5));//llo

}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.hspedu.string_;

/**
* @author 韩顺平
* @version 1.0
*/
public class StringMethod02 {
public static void main(String[] args) {
// 1.toUpperCase转换成大写
String s = "heLLo";
System.out.println(s.toUpperCase());//HELLO

// 2.toLowerCase
System.out.println(s.toLowerCase());//hello

// 3.concat拼接字符串
String s1 = "宝玉";
s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
System.out.println(s1);//宝玉林黛玉薛宝钗together

// 4.replace 替换字符串中的字符
s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
//在s1中,将 所有的 林黛玉 替换成薛宝钗
// 老韩解读: s1.replace() 方法执行后,返回的结果才是替换过的.
// 注意对 s1没有任何影响
String s11 = s1.replace("宝玉", "jack");
System.out.println(s1);//宝玉 and 林黛玉 林黛玉 林黛玉
System.out.println(s11);//jack and 林黛玉 林黛玉 林黛玉

// 5.split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
//老韩解读:
// 1. 以 , 为标准对 poem 进行分割 , 返回一个数组
// 2. 在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
String[] split = poem.split(",");
poem = "E:\\aaa\\bbb";
split = poem.split("\\\\");
System.out.println("==分割后内容===");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}

// 6.toCharArray 转换成字符数组
s = "happy";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.println(chs[i]);
}

// 7.compareTo 比较两个字符串的大小,如果前者大,
// 则返回正数,后者大,则返回负数,如果相等,返回0
// 老韩解读
// (1) 如果长度相同,并且每个字符也相同,就返回 0
// (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
// 就返回 if (c1 != c2) {
// return c1 - c2;
// }
// (3) 如果前面的部分都相同,就返回 str1.len - str2.len
String a = "jcck";// len = 3
String b = "jack";// len = 4
System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2的值

// 8.format 格式字符串
/* 占位符有:
* %s 字符串 %c 字符 %d 整型 %.2f 浮点型
*
*/
String name = "john";
int age = 10;
double score = 56.857;
char gender = '男';
//将所有的信息都拼接在一个字符串.
String info =
"我的姓名是" + name + "年龄是" + age + ",成绩是" + score + "性别是" + gender + "。希望大家喜欢我!";

System.out.println(info);


//老韩解读
//1. %s , %d , %.2f %c 称为占位符
//2. 这些占位符由后面变量来替换
//3. %s 表示后面由 字符串来替换
//4. %d 是整数来替换
//5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位, 并且进行四舍五入的处理
//6. %c 使用char 类型来替换
String formatStr = "我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c.希望大家喜欢我!";

String info2 = String.format(formatStr, name, age, score, gender);

System.out.println("info2=" + info2);
}
}
- -

2.StringBufferd类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.hspedu.stringbuffer_;

/**
* @author 韩顺平
* @version 1.0
*/
public class StringBufferMethod {
public static void main(String[] args) {

StringBuffer s = new StringBuffer("hello");
//增
s.append(',');// "hello,"
s.append("张三丰");//"hello,张三丰"
s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏100true10.5"
System.out.println(s);//"hello,张三丰赵敏100true10.5"


//删
/*
* 删除索引为>=start && <end 处的字符
* 解读: 删除 11~14的字符 [11, 14)
*/
s.delete(11, 14);
System.out.println(s);//"hello,张三丰赵敏true10.5"

//改
//老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11)
s.replace(9, 11, "周芷若");
System.out.println(s);//"hello,张三丰周芷若true10.5"
//查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
int indexOf = s.indexOf("张三丰");
System.out.println(indexOf);//6

//插
//老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
s.insert(9, "赵敏");
System.out.println(s);//"hello,张三丰赵敏周芷若true10.5"
//长度
System.out.println(s.length());//22
System.out.println(s);

}
}
- -

3.Math类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.hspedu.math_;

/**
* @author 韩顺平
* @version 1.0
*/
public class MathMethod {
public static void main(String[] args) {
//看看Math常用的方法(静态方法)
//1.abs 绝对值
int abs = Math.abs(-9);
System.out.println(abs);//9

//2.pow 求幂
double pow = Math.pow(2, 4);//2的4次方
System.out.println(pow);//16

//3.ceil 向上取整,返回>=该参数的最小整数(转成double);
double ceil = Math.ceil(3.9);
System.out.println(ceil);//4.0

//4.floor 向下取整,返回<=该参数的最大整数(转成double)
double floor = Math.floor(4.001);
System.out.println(floor);//4.0

//5.round 四舍五入 Math.floor(该参数+0.5)
long round = Math.round(5.51);
System.out.println(round);//6

//6.sqrt 求开方
double sqrt = Math.sqrt(9.0);
System.out.println(sqrt);//3.0

//7.random 求随机数
// random 返回的是 0 <= x < 1 之间的一个随机小数
// 思考:请写出获取 a-b之间的一个随机整数,a,b均为整数 ,比如 a = 2, b=7
// 即返回一个数 x 2 <= x <= 7
// 老韩解读 Math.random() * (b-a) 返回的就是 0 <= 数 <= b-a
// (1) (int)(a) <= x <= (int)(a + Math.random() * (b-a +1) )
// (2) 使用具体的数给小伙伴介绍 a = 2 b = 7
// (int)(a + Math.random() * (b-a +1) ) = (int)( 2 + Math.random()*6)
// Math.random()*6 返回的是 0 <= x < 6 小数
// 2 + Math.random()*6 返回的就是 2<= x < 8 小数
// (int)(2 + Math.random()*6) = 2 <= x <= 7
// (3) 公式就是 (int)(a + Math.random() * (b-a +1) )
for(int i = 0; i < 100; i++) {
System.out.println((int)(2 + Math.random() * (7 - 2 + 1)));
}

//8.max , min 返回最大值和最小值
int min = Math.min(1, 9);
int max = Math.max(45, 90);
System.out.println("min=" + min);
System.out.println("max=" + max);

}
}
- -

4.Arrays类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.hspedu.arrays_;

import java.util.Arrays;
import java.util.Comparator;

/**
* @author 韩顺平
* @version 1.0
*/
public class ArraysMethod01 {
public static void main(String[] args) {

Integer[] integers = {1, 20, 90};
//遍历数组
// for(int i = 0; i < integers.length; i++) {
// System.out.println(integers[i]);
// }
//直接使用Arrays.toString方法,显示数组
// System.out.println(Arrays.toString(integers));//

//演示 sort方法的使用

Integer arr[] = {1, -1, 7, 0, 89};
//进行排序
//老韩解读
//1. 可以直接使用冒泡排序 , 也可以直接使用Arrays提供的sort方法排序
//2. 因为数组是引用类型,所以通过sort排序后,会直接影响到 实参 arr
//3. sort重载的,也可以通过传入一个接口 Comparator 实现定制排序
//4. 调用 定制排序 时,传入两个参数 (1) 排序的数组 arr
// (2) 实现了Comparator接口的匿名内部类 , 要求实现 compare方法
//5. 先演示效果,再解释
//6. 这里体现了接口编程的方式 , 看看源码,就明白
// 源码分析
//(1) Arrays.sort(arr, new Comparator()
//(2) 最终到 TimSort类的 private static <T> void binarySort(T[] a, int lo, int hi, int start,
// Comparator<? super T> c)()
//(3) 执行到 binarySort方法的代码, 会根据动态绑定机制 c.compare()执行我们传入的
// 匿名内部类的 compare ()
// while (left < right) {
// int mid = (left + right) >>> 1;
// if (c.compare(pivot, a[mid]) < 0)
// right = mid;
// else
// left = mid + 1;
// }
//(4) new Comparator() {
// @Override
// public int compare(Object o1, Object o2) {
// Integer i1 = (Integer) o1;
// Integer i2 = (Integer) o2;
// return i2 - i1;
// }
// }
//(5) public int compare(Object o1, Object o2) 返回的值>0 还是 <0
// 会影响整个排序结果, 这就充分体现了 接口编程+动态绑定+匿名内部类的综合使用
// 将来的底层框架和源码的使用方式,会非常常见
//Arrays.sort(arr); // 默认排序方法
//定制排序
Arrays.sort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
return i2 - i1;
}
});
System.out.println("===排序后===");
System.out.println(Arrays.toString(arr));//



}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.hspedu.arrays_;

import java.util.Arrays;
import java.util.List;

/**
* @author 韩顺平
* @version 1.0
*/
public class ArraysMethod02 {
public static void main(String[] args) {
Integer[] arr = {1, 2, 90, 123, 567};
// binarySearch 通过二分搜索法进行查找,要求必须排好
// 老韩解读
//1. 使用 binarySearch 二叉查找
//2. 要求该数组是有序的. 如果该数组是无序的,不能使用binarySearch
//3. 如果数组中不存在该元素,就返回 return -(low + 1); // key not found.
int index = Arrays.binarySearch(arr, 567);
System.out.println("index=" + index);

//copyOf 数组元素的复制
// 老韩解读
//1. 从 arr 数组中,拷贝 arr.length个元素到 newArr数组中
//2. 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null
//3. 如果拷贝长度 < 0 就抛出异常NegativeArraySizeException
//4. 该方法的底层使用的是 System.arraycopy()
Integer[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println("==拷贝执行完毕后==");
System.out.println(Arrays.toString(newArr));

//ill 数组元素的填充
Integer[] num = new Integer[]{9,3,2};
//老韩解读
//1. 使用 99 去填充 num数组,可以理解成是替换原理的元素
Arrays.fill(num, 99);
System.out.println("==num数组填充后==");
System.out.println(Arrays.toString(num));

//equals 比较两个数组元素内容是否完全一致
Integer[] arr2 = {1, 2, 90, 123};
//老韩解读
//1. 如果arr 和 arr2 数组的元素一样,则方法true;
//2. 如果不是完全一样,就返回 false
boolean equals = Arrays.equals(arr, arr2);
System.out.println("equals=" + equals);

//asList 将一组值,转换成list
//老韩解读
//1. asList方法,会将 (2,3,4,5,6,1)数据转成一个List集合
//2. 返回的 asList 编译类型 List(接口)
//3. asList 运行类型 java.util.Arrays#ArrayList, 是Arrays类的
// 静态内部类 private static class ArrayList<E> extends AbstractList<E>
// implements RandomAccess, java.io.Serializable
List asList = Arrays.asList(2,3,4,5,6,1);
System.out.println("asList=" + asList);
System.out.println("asList的运行类型" + asList.getClass());



}
}
- -

5.System类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.hspedu.system_;

import java.util.Arrays;

/**
* @author 韩顺平
* @version 1.0
*/
public class System_ {
public static void main(String[] args) {

//exit 退出当前程序

// System.out.println("ok1");
// //老韩解读
// //1. exit(0) 表示程序退出
// //2. 0 表示一个状态 , 正常的状态
// System.exit(0);//
// System.out.println("ok2");

//arraycopy :复制数组元素,比较适合底层调用,
// 一般使用Arrays.copyOf完成复制数组

int[] src={1,2,3};
int[] dest = new int[3];// dest 当前是 {0,0,0}

//老韩解读
//1. 主要是搞清楚这五个参数的含义
//2.
// 源数组
// * @param src the source array.
// srcPos: 从源数组的哪个索引位置开始拷贝
// * @param srcPos starting position in the source array.
// dest : 目标数组,即把源数组的数据拷贝到哪个数组
// * @param dest the destination array.
// destPos: 把源数组的数据拷贝到 目标数组的哪个索引
// * @param destPos starting position in the destination data.
// length: 从源数组拷贝多少个数据到目标数组
// * @param length the number of array elements to be copied.
System.arraycopy(src, 0, dest, 0, src.length);
// int[] src={1,2,3};
System.out.println("dest=" + Arrays.toString(dest));//[1, 2, 3]

//currentTimeMillens:返回当前时间距离1970-1-1 的毫秒数
// 老韩解读:
System.out.println(System.currentTimeMillis());


}
}
- -

6.BigDecimal类和BigInteger类使用(大数处理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.hspedu.bignum;

import java.math.BigDecimal;

/**
* @author 韩顺平
* @version 1.0
*/
public class BigDecimal_ {
public static void main(String[] args) {
//当我们需要保存一个精度很高的数时,double 不够用
//可以是 BigDecimal
// double d = 1999.11111111111999999999999977788d;
// System.out.println(d);
BigDecimal bigDecimal = new BigDecimal("1999.11");
BigDecimal bigDecimal2 = new BigDecimal("3");
System.out.println(bigDecimal);

//老韩解读
//1. 如果对 BigDecimal进行运算,比如加减乘除,需要使用对应的方法
//2. 创建一个需要操作的 BigDecimal 然后调用相应的方法即可
System.out.println(bigDecimal.add(bigDecimal2));
System.out.println(bigDecimal.subtract(bigDecimal2));
System.out.println(bigDecimal.multiply(bigDecimal2));
//System.out.println(bigDecimal.divide(bigDecimal2));//可能抛出异常ArithmeticException
//在调用divide 方法时,指定精度即可. BigDecimal.ROUND_CEILING
//如果有无限循环小数,就会保留 分子 的精度
System.out.println(bigDecimal.divide(bigDecimal2, BigDecimal.ROUND_CEILING));
}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.hspedu.bignum;

import java.math.BigInteger;

/**
* @author 韩顺平
* @version 1.0
*/
public class BigInteger_ {
public static void main(String[] args) {

//当我们编程中,需要处理很大的整数,long 不够用
//可以使用BigInteger的类来搞定
// long l = 23788888899999999999999999999l;
// System.out.println("l=" + l);

BigInteger bigInteger = new BigInteger("23788888899999999999999999999");
BigInteger bigInteger2 = new BigInteger("10099999999999999999999999999999999999999999999999999999999999999999999999999999999");
System.out.println(bigInteger);
//老韩解读
//1. 在对 BigInteger 进行加减乘除的时候,需要使用对应的方法,不能直接进行 + - * /
//2. 可以创建一个 要操作的 BigInteger 然后进行相应操作
BigInteger add = bigInteger.add(bigInteger2);
System.out.println(add);//
BigInteger subtract = bigInteger.subtract(bigInteger2);
System.out.println(subtract);//减
BigInteger multiply = bigInteger.multiply(bigInteger2);
System.out.println(multiply);//乘
BigInteger divide = bigInteger.divide(bigInteger2);
System.out.println(divide);//除


}
}
- -

7.时间类、日期类的常用方法(Date、Calendar,第三代日期类)

第一代日期类:

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.hspedu.date_;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
* @author 韩顺平
* @version 1.0
*/
public class Date01 {
public static void main(String[] args) throws ParseException {

//老韩解读
//1. 获取当前系统时间
//2. 这里的Date 类是在java.util包
//3. 默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换
Date d1 = new Date(); //获取当前系统时间
System.out.println("当前日期=" + d1);
Date d2 = new Date(9234567); //通过指定毫秒数得到时间
System.out.println("d2=" + d2); //获取某个时间对应的毫秒数
//

//老韩解读
//1. 创建 SimpleDateFormat对象,可以指定相应的格式
//2. 这里的格式使用的字母是规定好,不能乱写

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
String format = sdf.format(d1); // format:将日期转换成指定格式的字符串
System.out.println("当前日期=" + format);

//老韩解读
//1. 可以把一个格式化的String 转成对应的 Date
//2. 得到Date 仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
//3. 在把String -> Date , 使用的 sdf 格式需要和你给的String的格式一样,否则会抛出转换异常
String s = "1996年01月01日 10:20:30 星期一";
Date parse = sdf.parse(s);
System.out.println("parse=" + sdf.format(parse));

}
}
- -

第二代日期类

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.hspedu.date_;

import java.util.Calendar;

/**
* @author 韩顺平
* @version 1.0
*/
public class Calendar_ {
public static void main(String[] args) {
//老韩解读
//1. Calendar是一个抽象类, 并且构造器是private,不能实例化对象
//2. 可以通过 getInstance() 来获取实例
//3. 提供大量的方法和字段提供给程序员
//4. Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)
//5. 如果我们需要按照 24小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
Calendar c = Calendar.getInstance(); //创建日历类对象//比较简单,自由
System.out.println("c=" + c);
//2.获取日历对象的某个日历字段
System.out.println("年:" + c.get(Calendar.YEAR));
// 这里为什么要 + 1, 因为Calendar 返回月时候,是按照 0 开始编号
System.out.println("月:" + (c.get(Calendar.MONTH) + 1));
System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
System.out.println("小时:" + c.get(Calendar.HOUR));
System.out.println("分钟:" + c.get(Calendar.MINUTE));
System.out.println("秒:" + c.get(Calendar.SECOND));
//Calender 没有专门的格式化方法,所以需要程序员自己来组合显示
System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) +
" " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) );

}
}
- -

第三代日期类(开发中尽量使用第三代日期类)

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.hspedu.date_;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;

/**
* @author 韩顺平
* @version 1.0
*/
public class LocalDate_ {
public static void main(String[] args) {
//第三代日期
//老韩解读
//1. 使用now() 返回表示当前日期时间的 对象
LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now();//LocalTime.now()
System.out.println(ldt);

//2. 使用DateTimeFormatter 对象来进行格式化
// 创建 DateTimeFormatter对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dateTimeFormatter.format(ldt);
System.out.println("格式化的日期=" + format);

System.out.println("年=" + ldt.getYear());
System.out.println("月=" + ldt.getMonth());
System.out.println("月=" + ldt.getMonthValue());
System.out.println("日=" + ldt.getDayOfMonth());
System.out.println("时=" + ldt.getHour());
System.out.println("分=" + ldt.getMinute());
System.out.println("秒=" + ldt.getSecond());

LocalDate now = LocalDate.now(); //可以获取年月日
LocalTime now2 = LocalTime.now();//获取到时分秒


//提供 plus 和 minus方法可以对当前时间进行加或者减
//看看890天后,是什么时候 把 年月日-时分秒
LocalDateTime localDateTime = ldt.plusDays(890);
System.out.println("890天后=" + dateTimeFormatter.format(localDateTime));

//看看在 3456分钟前是什么时候,把 年月日-时分秒输出
LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
System.out.println("3456分钟前 日期=" + dateTimeFormatter.format(localDateTime2));

}
}

- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.hspedu.date_;

import java.time.Instant;
import java.util.Date;

/**
* @author 韩顺平
* @version 1.0
*/
public class Instant_ {
public static void main(String[] args) {

//1.通过 静态方法 now() 获取表示当前时间戳的对象
Instant now = Instant.now();//获取时间戳对象,时间更加精准
System.out.println(now);
//2. 通过 from 可以把 Instant转成 Date
Date date = Date.from(now);
//3. 通过 date的toInstant() 可以把 date 转成Instant对象
Instant instant = date.toInstant();

}
}
- -

8.实现List接口实现类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.hspedu.list_;

import java.util.ArrayList;
import java.util.List;

/**
* @author 韩顺平
* @version 1.0
*/
public class ListMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("张三丰");
list.add("贾宝玉");
// void add(int index, Object ele):在index位置插入ele元素
//在index = 1的位置插入一个对象
list.add(1, "韩顺平");
System.out.println("list=" + list);
// boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
List list2 = new ArrayList();
list2.add("jack");
list2.add("tom");
list.addAll(1, list2);
System.out.println("list=" + list);
// Object get(int index):获取指定index位置的元素
//说过
// int indexOf(Object obj):返回obj在集合中首次出现的位置
System.out.println(list.indexOf("tom"));//2
// int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
list.add("韩顺平");
System.out.println("list=" + list);
System.out.println(list.lastIndexOf("韩顺平"));
// Object remove(int index):移除指定index位置的元素,并返回此元素
list.remove(0);
System.out.println("list=" + list);
// Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.
list.set(1, "玛丽");
System.out.println("list=" + list);
// List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
// 注意返回的子集合 fromIndex <= subList < toIndex
List returnlist = list.subList(0, 2);
System.out.println("returnlist=" + returnlist);

}
}
- -

9.Map接口的常用方法以及遍历方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.hspedu.map_;

import java.util.HashMap;
import java.util.Map;

/**
* @author 韩顺平
* @version 1.0
*/
@SuppressWarnings({"all"})
public class MapMethod {
public static void main(String[] args) {
//演示map接口常用方法

Map map = new HashMap();
map.put("邓超", new Book("", 100));//OK
map.put("邓超", "孙俪");//替换-> 一会分析源码
map.put("王宝强", "马蓉");//OK
map.put("宋喆", "马蓉");//OK
map.put("刘令博", null);//OK
map.put(null, "刘亦菲");//OK
map.put("鹿晗", "关晓彤");//OK
map.put("hsp", "hsp的老婆");

System.out.println("map=" + map);

// remove:根据键删除映射关系
map.remove(null);
System.out.println("map=" + map);
// get:根据键获取值
Object val = map.get("鹿晗");
System.out.println("val=" + val);
// size:获取元素个数
System.out.println("k-v=" + map.size());
// isEmpty:判断个数是否为0
System.out.println(map.isEmpty());//F
// clear:清除k-v
//map.clear();
System.out.println("map=" + map);
// containsKey:查找键是否存在
System.out.println("结果=" + map.containsKey("hsp"));//T


}
}

class Book {
private String name;
private int num;

public Book(String name, int num) {
this.name = name;
this.num = num;
}
}
- -

遍历方式

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.hspedu.map_;

import java.util.*;

/**
* @author 韩顺平
* @version 1.0
*/
@SuppressWarnings({"all"})
public class MapFor {
public static void main(String[] args) {

Map map = new HashMap();
map.put("邓超", "孙俪");
map.put("王宝强", "马蓉");
map.put("宋喆", "马蓉");
map.put("刘令博", null);
map.put(null, "刘亦菲");
map.put("鹿晗", "关晓彤");

//第一组: 先取出 所有的Key , 通过Key 取出对应的Value

//着重记住第一种方式,其他的方式开发中用到了,可以查
Set keyset = map.keySet();
//(1) 增强for
System.out.println("-----第一种方式-------");
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}


//(2) 迭代器
System.out.println("----第二种方式--------");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}

//第二组: 把所有的values取出
Collection values = map.values();
//这里可以使用所有的Collections使用的遍历方法
//(1) 增强for
System.out.println("---取出所有的value 增强for----");
for (Object value : values) {
System.out.println(value);
}
//(2) 迭代器
System.out.println("---取出所有的value 迭代器----");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);

}

//第三组: 通过EntrySet 来获取 k-v
Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>>
//(1) 增强for
System.out.println("----使用EntrySet 的 for增强(第3种)----");
for (Object entry : entrySet) {
//将entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
System.out.println("----使用EntrySet 的 迭代器(第4种)----");
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}


}
}
- -

9.Collections工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.hspedu.collections_;

import java.util.*;

/**
* @author 韩顺平
* @version 1.0
*/
@SuppressWarnings({"all"})
public class Collections_ {
public static void main(String[] args) {

//创建ArrayList 集合,用于测试.
List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");
list.add("tom");


// reverse(List):反转 List 中元素的顺序
Collections.reverse(list);
System.out.println("list=" + list);
// shuffle(List):对 List 集合元素进行随机排序
// for (int i = 0; i < 5; i++) {
// Collections.shuffle(list);
// System.out.println("list=" + list);
// }

// sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
Collections.sort(list);
System.out.println("自然排序后");
System.out.println("list=" + list);
// sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
//我们希望按照 字符串的长度大小排序
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//可以加入校验代码.
return ((String) o2).length() - ((String) o1).length();
}
});
System.out.println("字符串长度大小排序=" + list);
// swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

//比如
Collections.swap(list, 0, 1);
System.out.println("交换后的情况");
System.out.println("list=" + list);

//Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
System.out.println("自然顺序最大元素=" + Collections.max(list));
//Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
//比如,我们要返回长度最大的元素
Object maxObject = Collections.max(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length() - ((String)o2).length();
}
});
System.out.println("长度最大的元素=" + maxObject);


//Object min(Collection)
//Object min(Collection,Comparator)
//上面的两个方法,参考max即可

//int frequency(Collection,Object):返回指定集合中指定元素的出现次数
System.out.println("tom出现的次数=" + Collections.frequency(list, "tom"));

//void copy(List dest,List src):将src中的内容复制到dest中

ArrayList dest = new ArrayList();
//为了完成一个完整拷贝,我们需要先给dest 赋值,大小和list.size()一样
for(int i = 0; i < list.size(); i++) {
dest.add("");
}
//拷贝
Collections.copy(dest, list);
System.out.println("dest=" + dest);//把后一个集合的数据拷贝到前一个集合

//boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
//如果list中,有tom 就替换成 汤姆
Collections.replaceAll(list, "tom", "汤姆");
System.out.println("list替换后=" + list);


}
}
- -

10.创建文件的三种方式以及文件的相关操作(相关方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.hspedu.file;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
* 创建文件的方式
*/
public class FileCreate {
public static void main(String[] args) {

}
@Test
//第一种方式:new File(fileName);
public void create01(){
String filePath = "c:\\news1.txt";//也可以写成"c:/news1.txt"
File file = new File(filePath);
try {
file.createNewFile();
System.out.println("文件创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}



//第二种方式:new File(File parent,String child)//根据父目录文件+子路径构建
@Test
public void create02(){
File parentFile = new File("c:\\");//也可以写成"c:/"
String fileName = "news2.txt";
File file = new File(parentFile, fileName);
try {
file.createNewFile();
System.out.println(fileName+" 文件创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}



//第三种方式:new File(String parent,String child)//根据父目录+子路径构建
@Test
public void create03(){
String parentPath = "c:\\";//也可以写成"c:/"
String fileName = "news3.txt";
File file = new File(parentPath, fileName);
try {
file.createNewFile();
System.out.println(fileName+"文件创建成功");
} catch (IOException e) {
e.printStackTrace();
}
}



}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.hspedu.file;

import org.junit.jupiter.api.Test;

import java.io.File;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
*/
public class FileInformation {
public static void main(String[] args) {

}
//获取文件信息
@Test
public void info(){
//先创建文件的对象,这里并没有创建文件,有点像是读取文件
File file = new File("c:\\news1.txt");

//调用相应的方法,得到对应的信息
//得到文件名
System.out.println("文件名="+file.getName());
//文件的绝对路径
System.out.println("文件的绝对路径="+file.getAbsolutePath());
//文件的父级目录
System.out.println("文件父级目录="+file.getParent());
//文件的大小,返回的是字节(一个英文字母对应的是一个字节,一个汉字对应的是三个字节)
System.out.println("文件的大小(字节)="+file.length());
//文件是否存在,返回的是true /false
System.out.println("文件是否存在="+file.exists());
//是不是一个文件
System.out.println("是不是一个文件="+file.isFile());
//是不是一个目录
System.out.println("是不是一个目录="+file.isDirectory());

}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.hspedu.file;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;

/**
* @author 韩顺平
* @version 1.0
*/
public class Directory_ {
public static void main(String[] args) {

//
}

//判断 d:\\news1.txt 是否存在,如果存在就删除
@Test
public void m1() {

String filePath = "e:\\news1.txt";
File file = new File(filePath);
if (file.exists()) {
if (file.delete()) {
System.out.println(filePath + "删除成功");
} else {
System.out.println(filePath + "删除失败");
}
} else {
System.out.println("该文件不存在...");
}

}

//判断 D:\\demo02 是否存在,存在就删除,否则提示不存在
//这里我们需要体会到,在java编程中,目录也被当做文件
@Test
public void m2() {

String filePath = "D:\\demo02";
File file = new File(filePath);
if (file.exists()) {
if (file.delete()) {
System.out.println(filePath + "删除成功");
} else {
System.out.println(filePath + "删除失败");
}
} else {
System.out.println("该目录不存在...");
}

}

//判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示已经存在,否则就创建
@Test
public void m3() {

String directoryPath = "D:\\demo\\a\\b\\c";
File file = new File(directoryPath);
if (file.exists()) {
System.out.println(directoryPath + "存在..");
} else {
if (file.mkdirs()) { //创建一级目录使用mkdir() ,创建多级目录使用mkdirs()
System.out.println(directoryPath + "创建成功..");
} else {
System.out.println(directoryPath + "创建失败...");
}
}



}
}
- -

11.FileInputStream 字节输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.hspedu.inputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* @author 韩顺平
* @version 1.0
* 演示FileInputStream的使用(字节输入流 文件--> 程序)
*/
public class FileInputStream_ {
public static void main(String[] args) {

}

/**
* 演示读取文件...
* 单个字节的读取,效率比较低
* -> 使用 read(byte[] b)
*/
@Test
public void readFile01() {
String filePath = "e:\\hello.txt";
int readData = 0;
FileInputStream fileInputStream = null;
try {
//创建 FileInputStream 对象,用于读取 文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。
//如果返回-1 , 表示读取完毕
while ((readData = fileInputStream.read()) != -1) {//返回的是一个int类型的字节值
System.out.print((char)readData);//转成char显示
}

} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件流,释放资源.
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

/**
* 使用 read(byte[] b) 读取文件,提高效率
*/
@Test
public void readFile02() {
String filePath = "e:\\hello.txt";
//字节数组
byte[] buf = new byte[8]; //一次读取8个字节.
int readLen = 0;
FileInputStream fileInputStream = null;
try {
//创建 FileInputStream 对象,用于读取 文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
//如果返回-1 , 表示读取完毕
//如果读取正常, 返回实际读取的字节数
while ((readLen = fileInputStream.read(buf)) != -1) {//返回的是读取的字节数
System.out.print(new String(buf, 0, readLen));//显示
}

} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件流,释放资源.
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}
- -

12.FileOutputStream 字节输出流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.hspedu.outputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* @author 韩顺平
* @version 1.0
*/
public class FileOutputStream01 {
public static void main(String[] args) {

}

/**
* 演示使用FileOutputStream 将数据写到文件中,
* 如果该文件不存在,则创建该文件
*/
@Test
public void writeFile() {

//创建 FileOutputStream对象
String filePath = "e:\\a.txt";
FileOutputStream fileOutputStream = null;
try {
//得到 FileOutputStream对象 对象
//老师说明
//1. new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容
//2. new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面
fileOutputStream = new FileOutputStream(filePath, true);
//写入一个字节
//fileOutputStream.write('H');//
//写入字符串
String str = "hsp,world!";
//str.getBytes() 可以把 字符串-> 字节数组
//fileOutputStream.write(str.getBytes());
/*
write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流
从off开始,写len个字节写入到文件中
*/
fileOutputStream.write(str.getBytes(), 0, 3);

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- -

13.文件拷贝(FileInputStream和FileOutputStream)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.hspedu.outputstream_;

import com.hspedu.inputstream_.FileInputStream_;

import java.io.*;

/**
* @author 韩顺平
* @version 1.0
*/
public class FileCopy {
public static void main(String[] args) {
//完成 文件拷贝,将 e:\\Koala.jpg 拷贝 c:\\
//思路分析
//1. 创建文件的输入流 , 将文件读入到程序
//2. 创建文件的输出流, 将读取到的文件数据,写入到指定的文件.
String srcFilePath = "e:\\Koala.jpg";
String destFilePath = "e:\\Koala3.jpg";
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;

try {

fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
//定义一个字节数组,提高读取效果
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = fileInputStream.read(buf)) != -1) {
//读取到后,就写入到文件 通过 fileOutputStream
//即,是一边读,一边写
fileOutputStream.write(buf, 0, readLen);//一定要使用这个方法

}
System.out.println("拷贝ok~");


} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭输入流和输出流,释放资源
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}


}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.hspedu.writer_;

import java.io.*;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
* 拷贝文件
*/
public class BufferedCopy_ {
public static void main(String[] args) throws Exception {
//源文件
String srcFilePath = "c:\\story.txt";
//目标文件
String destFilePath = "c:\\dest.txt";
BufferedReader bufferedReader = new BufferedReader(new FileReader(srcFilePath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
String line;
while ((line = bufferedReader.readLine()) != null){
//取到的每一行加入到目标文件中
bufferedWriter.write(line);
//换行符
bufferedWriter.newLine();
}
//关闭流
bufferedReader.close();
bufferedWriter.close();
}
}
- -

14.FileReader 字符输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.hspedu.reader_;

import org.junit.jupiter.api.Test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
* @author 韩顺平
* @version 1.0
*/
public class FileReader_ {
public static void main(String[] args) {


}

/**
* 单个字符读取文件
*/
@Test
public void readFile01() {
String filePath = "e:\\story.txt";
FileReader fileReader = null;
int data = 0;
//1. 创建FileReader对象
try {
fileReader = new FileReader(filePath);
//循环读取 使用read, 单个字符读取
while ((data = fileReader.read()) != -1) {
System.out.print((char) data);
}

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 字符数组读取文件
*/
@Test
public void readFile02() {
System.out.println("~~~readFile02 ~~~");
String filePath = "e:\\story.txt";
FileReader fileReader = null;

int readLen = 0;
char[] buf = new char[8];
//1. 创建FileReader对象
try {
fileReader = new FileReader(filePath);
//循环读取 使用read(buf), 返回的是实际读取到的字符数
//如果返回-1, 说明到文件结束
while ((readLen = fileReader.read(buf)) != -1) {
System.out.print(new String(buf, 0, readLen));
}

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
- -

15.FileWriter 字符输出流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.hspedu.writer_;

import java.io.FileWriter;
import java.io.IOException;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
*/
public class FileWriter_ {
public static void main(String[] args) {
String filePath = "c:\\note.txt";
FileWriter fileWriter = null;
char[] chars = {'a','b','c'};
try {
fileWriter = new FileWriter(filePath);
fileWriter.write('H');//写入单个字符
fileWriter.write(chars);//写入字符数组
fileWriter.write("韩顺平教育".toCharArray(),0,3);//写入数组的指定部分
fileWriter.write(" 你好北京~");//写入整个字符串
fileWriter.write("上海你好",0,2);//写入字符串的指定部分
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//下面的两种方式二选一,必须选一个,否则文件无法写入
fileWriter.flush();
fileWriter.close();//等价于 flush() + 关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- -

16.BufferedReader 字符处理流(包装流)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.hspedu.reader_;

import java.io.BufferedReader;
import java.io.FileReader;

/**
* @author 韩顺平
* @version 1.0
* 演示bufferedReader 使用
*/
public class BufferedReader_ {
public static void main(String[] args) throws Exception {

String filePath = "e:\\a.java";
//创建bufferedReader
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
//读取
String line; //按行读取, 效率高
//说明
//1. bufferedReader.readLine() 是按行读取文件
//2. 当返回null 时,表示文件读取完毕
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}

//关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
//FileReader。
/*
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();//in 就是我们传入的 new FileReader(filePath), 关闭了.
} finally {
in = null;
cb = null;
}
}
}

*/
bufferedReader.close();

}
}
- -

17.BufferedWriter 字符处理流(包装流)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.hspedu.writer_;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
*/
public class BufferWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "c:\\note.txt";
//new FileWriter(filePath,true);表示以追加的方式加入
//new FileWriter(filePath);表示以覆盖的方式加入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
bufferedWriter.write("你好,韩顺平!");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.write("你好,韩顺平!");
bufferedWriter.newLine();
bufferedWriter.write("你好,韩顺平!");
//关闭的是外层流(BufferedWriter),在底层也关闭了FileWriter节点流
bufferedWriter.close();
}
}
- -

18.文件拷贝(BufferedInputStream和BufferedOutputStream)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.hspedu.outputstream_;

import java.io.*;

/**
* @author 韩顺平
* @version 1.0
* 演示使用BufferedOutputStream 和 BufferedInputStream使用
* 使用他们,可以完成二进制文件拷贝.
* 思考:字节流可以操作二进制文件,可以操作文本文件吗?当然可以
*/
public class BufferedCopy02 {
public static void main(String[] args) {

// String srcFilePath = "e:\\Koala.jpg";
// String destFilePath = "e:\\hsp.jpg";
// String srcFilePath = "e:\\0245_韩顺平零基础学Java_引出this.avi";
// String destFilePath = "e:\\hsp.avi";
String srcFilePath = "e:\\a.java";
String destFilePath = "e:\\a3.java";

//创建BufferedOutputStream对象BufferedInputStream对象
BufferedInputStream bis = null;
BufferedOutputStream bos = null;

try {
//因为 FileInputStream 是 InputStream 子类
bis = new BufferedInputStream(new FileInputStream(srcFilePath));
bos = new BufferedOutputStream(new FileOutputStream(destFilePath));

//循环的读取文件,并写入到 destFilePath
byte[] buff = new byte[1024];
int readLen = 0;
//当返回 -1 时,就表示文件读取完毕
while ((readLen = bis.read(buff)) != -1) {
bos.write(buff, 0, readLen);
}

System.out.println("文件拷贝完毕~~~");

} catch (IOException e) {
e.printStackTrace();
} finally {

//关闭流 , 关闭外层的处理流即可,底层会去关闭节点流
try {
if(bis != null) {
bis.close();
}
if(bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}

}


}
}
- -

19. ObjectOutputStream 序列化操作(对象字节输出流 )保存数据类型和数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.hspedu.outputstream_;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
* @author 韩顺平
* @version 1.0
* 演示ObjectOutputStream的使用, 完成数据的序列化
*/
public class ObjectOutStream_ {
public static void main(String[] args) throws Exception {
//序列化后,保存的文件格式,不是纯文本,而是按照他的格式来保存
String filePath = "e:\\data.dat";

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

//序列化数据到 e:\data.dat
oos.writeInt(100);// int -> Integer (实现了 Serializable)
oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oos.writeChar('a');// char -> Character (实现了 Serializable)
oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
oos.writeUTF("韩顺平教育");//String (实现了 Serializable)
//保存一个dog对象
//Dog也要实现序列化接口
oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
oos.close();
System.out.println("数据保存完毕(序列化形式)");


}
}
- -

20.ObjectInputStream 反序列化操作(对象字节输入流 )恢复数据类型和数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.hspedu.inputstream_;
import com.hspedu.outputstream_.Dog;
import java.io.*;
/**
* @author 韩顺平
* @version 1.0
*/
public class ObjectInputStream_ {
public static void main(String[] args) throws IOException, ClassNotFoundException {

//指定反序列化的文件
String filePath = "e:\\data.dat";

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));

//读取
//老师解读
//1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
//2. 否则会出现异常

System.out.println(ois.readInt());
System.out.println(ois.readBoolean());

System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());


//dog 的编译类型是 Object , dog 的运行类型是 Dog
Object dog = ois.readObject();
System.out.println("运行类型=" + dog.getClass());
System.out.println("dog信息=" + dog);//底层 Object -> Dog

//这里是特别重要的细节:

//1. 如果我们希望调用Dog的方法, 需要向下转型
Dog dog2 = (Dog)dog;
System.out.println(dog2.getName()); //旺财..

//关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流
ois.close();


}
}
- -

21.InputStreamReader (转换流 字节流转化成字符流)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.hspedu.transformation;

import java.io.*;

/**
* @author 韩顺平
* @version 1.0
* 演示使用 InputStreamReader 转换流解决中文乱码问题
* 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8
*/
public class InputStreamReader_ {
public static void main(String[] args) throws IOException {

String filePath = "e:\\a.txt";
//解读
//1. 把 FileInputStream 转成 InputStreamReader
//2. 指定编码 gbk
//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//3. 把 InputStreamReader 传入 BufferedReader
//BufferedReader br = new BufferedReader(isr);

//将2 和 3 合在一起
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));

//4. 读取
String s = br.readLine();
System.out.println("读取内容=" + s);
//5. 关闭外层流
br.close();

}


}
- -

22.OutputStreamWriter(转换流 字节流转成成字符流)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.hspedu.transformation;

import java.io.*;

/**
* @author 韩顺平
* @version 1.0
* 演示 OutputStreamWriter 使用
* 把FileOutputStream 字节流,转成字符流 OutputStreamWriter
* 指定处理的编码 gbk/utf-8/utf8
*/
public class OutputStreamWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\hsp.txt";
String charSet = "utf-8";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
osw.write("hi, 韩顺平教育");
osw.close();
System.out.println("按照 " + charSet + " 保存文件成功~");


}
}
- -

23.PrintStream(字节打印流)只有输出流,没有输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.hspedu.printstream;

import java.io.IOException;
import java.io.PrintStream;

/**
* @author 韩顺平
* @version 1.0
* 演示PrintStream (字节打印流/输出流)
*/
public class PrintStream_ {
public static void main(String[] args) throws IOException {

PrintStream out = System.out;
//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
/*
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}

*/
out.print("john, hello");
//因为print底层使用的是write , 所以我们可以直接调用write进行打印/输出
out.write("韩顺平,你好".getBytes());
out.close();

//我们可以去修改打印流输出的位置/设备
//1. 输出修改成到 "e:\\f1.txt"
//2. "hello, 韩顺平教育~" 就会输出到 e:\f1.txt
//3. public static void setOut(PrintStream out) {
// checkIO();
// setOut0(out); // native 方法,修改了out
// }
System.setOut(new PrintStream("e:\\f1.txt"));
System.out.println("hello, 韩顺平教育~");


}
}
- -

24.PrintWriter (字符打印流)只有输出流,没有输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.hspedu.transformation;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
* @author 韩顺平
* @version 1.0
* 演示 PrintWriter 使用方式
*/
public class PrintWriter_ {
public static void main(String[] args) throws IOException {

//PrintWriter printWriter = new PrintWriter(System.out);//默认显示在显示器上
PrintWriter printWriter = new PrintWriter(new FileWriter("e:\\f2.txt"));
printWriter.print("hi, 北京你好~~~~");
//关闭或者刷新才会写入
printWriter.close();//flush + 关闭流, 才会将数据写入到文件..

}
}
- -

25.Properties读取修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.hspedu.properties_;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
* @author 韩顺平
* @version 1.0
*/
public class Properties02 {
public static void main(String[] args) throws IOException {
//使用Properties 类来读取mysql.properties 文件

//1. 创建Properties 对象
Properties properties = new Properties();
//2. 加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));
//3. 把k-v显示控制台
properties.list(System.out);
//4. 根据key 获取对应的值
String user = properties.getProperty("user");
String pwd = properties.getProperty("pwd");
System.out.println("用户名=" + user);
System.out.println("密码是=" + pwd);



}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.hspedu.properties_;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
* @author 韩顺平
* @version 1.0
*/
public class Properties03 {
public static void main(String[] args) throws IOException {
//使用Properties 类来创建 配置文件, 修改配置文件内容

Properties properties = new Properties();
//创建
//1.如果该文件没有key 就是创建
//2.如果该文件有key ,就是修改
/*
Properties 父类是 Hashtable , 底层就是Hashtable 核心方法
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}

// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;//如果key 存在,就替换
return old;
}
}

addEntry(hash, key, value, index);//如果是新k, 就addEntry
return null;
}

*/
properties.setProperty("charset", "utf8");
properties.setProperty("user", "汤姆");//注意保存时,是中文的 unicode码值
properties.setProperty("pwd", "888888");

//将k-v 存储文件中即可
properties.store(new FileOutputStream("src\\mysql2.properties"), null);
System.out.println("保存配置文件成功~");

}
}
- -

26.InetAddress类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.hspedu.api;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
* @author 韩顺平
* @version 1.0
* 演示InetAddress 类的使用
*/
public class API_ {
public static void main(String[] args) throws UnknownHostException {

//1. 获取本机的InetAddress 对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//DESKTOP-S4MP84S/192.168.12.1

//2. 根据指定主机名 获取 InetAddress对象
InetAddress host1 = InetAddress.getByName("DESKTOP-S4MP84S");
System.out.println("host1=" + host1);//DESKTOP-S4MP84S/192.168.12.1

//3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println("host2=" + host2);//www.baidu.com / 110.242.68.4

//4. 通过 InetAddress 对象,获取对应的地址
String hostAddress = host2.getHostAddress();//IP 110.242.68.4
System.out.println("host2 对应的ip = " + hostAddress);//110.242.68.4

//5. 通过 InetAddress 对象,获取对应的主机名/或者的域名
String hostName = host2.getHostName();
System.out.println("host2对应的主机名/域名=" + hostName); // www.baidu.com

}
}
- -

27.网络编程相关题目的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
题目
(1)编写客户端程序和服务器端程序
(2)客户端可以输入一个 音乐 的文件名,比如 高山流水,服务端 收到音乐后,可以给客户端 返回这个 音乐文件
如果服务器没有这文件,返回一个默认的音乐即可。
(3)客户端收到文件后,保存在本地 c:\\
(4)该程序可以使用StreamUtils.java
*/



package com.hspedu.homework;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
* 客户端
*/
public class Homework03Client {
public static void main(String[] args) throws Exception {
//通过对方的IP地址和端口向对方发送数据
Socket socket = new Socket(InetAddress.getLocalHost(), 9898);
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个歌曲名:");
String songName = scanner.next();
bufferedWriter.write(songName);
bufferedWriter.flush();
socket.shutdownOutput();
//接收相应的歌曲
String destFilePath = "src\\歌曲.mp3";
InputStream inputStream = socket.getInputStream();
byte[] bytes = StreamUtils.streamToByteArray(inputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();


//关闭对应的流和socket
System.out.println("客户端退出");
socket.close();
bufferedWriter.close();
bufferedOutputStream.close();


}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.hspedu.homework;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* @author GongChangjiang
* @version 1.0
* 我亦无他 惟手熟尔
* 服务端
*/
public class Homework03Server {
public static void main(String[] args) throws Exception {
System.out.println("服务器端正在9898端口监听......");
ServerSocket serverSocket = new ServerSocket(9898);
Socket socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = bufferedReader.readLine();
System.out.println(s);
//根据输入的歌曲名做出相应的操作

if("高山流水".equals(s)){
String filePath = "c:\\AlYun\\高山流水.mp3";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(bytes);
socket.shutdownOutput();
}else {
String filePath = "c:\\AlYun\\无名.mp3";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(bytes);
socket.shutdownOutput();
}

//关闭相应的流和socket
System.out.println("服务端退出");
serverSocket.close();
socket.close();
bufferedReader.close();

}
}
- -
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.hspedu.homework;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
* 此类用于演示关于流的读写方法
*
*/
public class StreamUtils {
/**
* 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]
* @param is
* @return
* @throws Exception
*/
public static byte[] streamToByteArray(InputStream is) throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
byte[] b = new byte[1024];//字节数组
int len;
while((len=is.read(b))!=-1){//循环读取
bos.write(b, 0, len);//把读取到的数据,写入bos
}
byte[] array = bos.toByteArray();//然后将bos 转成字节数组
bos.close();
return array;
}
/**
* 功能:将InputStream转换成String
* @param is
* @return
* @throws Exception
*/

public static String streamToString(InputStream is) throws Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder= new StringBuilder();
String line;
while((line=reader.readLine())!=null){
builder.append(line+"\r\n");
}
return builder.toString();

}

}
- -

28.Class类对象的常用方法举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.hspedu.reflection.class_;

import com.hspedu.Car;

import java.lang.reflect.Field;

/**
* @author 韩顺平
* @version 1.0
* 演示Class类的常用方法
*/
public class Class02 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {

String classAllPath = "com.hspedu.Car";
//1 . 获取到Car类 对应的 Class对象
//<?> 表示不确定的Java类型
Class<?> cls = Class.forName(classAllPath);
//2. 输出cls
System.out.println(cls); //显示cls对象, 是哪个类的Class对象 com.hspedu.Car
System.out.println(cls.getClass());//输出cls运行类型 java.lang.Class
//3. 得到包名
System.out.println(cls.getPackage().getName());//包名
//4. 得到全类名
System.out.println(cls.getName());
//5. 通过cls创建对象实例
Car car = (Car) cls.newInstance();
System.out.println(car);//car.toString()
//6. 通过反射获取属性 brand
Field brand = cls.getField("brand");
System.out.println(brand.get(car));//宝马
//7. 通过反射给属性赋值
brand.set(car, "奔驰");
System.out.println(brand.get(car));//奔驰
//8 我希望大家可以得到所有的属性(字段)
System.out.println("=======所有的字段属性====");
Field[] fields = cls.getFields();
for (Field f : fields) {
System.out.println(f.getName());//名称
}


}
}
//用于举例的辅助类
public class Car {
public String brand = "宝马";//品牌
public int price = 500000;
public String color = "白色";

@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", color='" + color + '\'' +
'}';
}
}

- -

29.获取Class对象的六种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.hspedu.reflection.class_;

import com.hspedu.Car;

/**
* @author 韩顺平
* @version 1.0
* 演示得到Class对象的各种方式(6)
*/
public class GetClass_ {
public static void main(String[] args) throws ClassNotFoundException {

//1. Class.forName
String classAllPath = "com.hspedu.Car"; //通过读取配置文件获取
Class<?> cls1 = Class.forName(classAllPath);
System.out.println(cls1);

//2. 类名.class , 应用场景: 用于参数传递
Class cls2 = Car.class;
System.out.println(cls2);

//3. 对象.getClass(), 应用场景,有对象实例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3);

//4. 通过类加载器【4种】来获取到类的Class对象
//(1)先得到类加载器 car
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器得到Class对象
Class cls4 = classLoader.loadClass(classAllPath);
System.out.println(cls4);

//cls1 , cls2 , cls3 , cls4 其实是同一个对象
System.out.println(cls1.hashCode());
System.out.println(cls2.hashCode());
System.out.println(cls3.hashCode());
System.out.println(cls4.hashCode());

//5. 基本数据(int, char,boolean,float,double,byte,long,short) 按如下方式得到Class类对象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass);//int

//6. 基本数据类型对应的包装类,可以通过 .TYPE 得到Class类对象
Class<Integer> type1 = Integer.TYPE;
Class<Character> type2 = Character.TYPE; //其它包装类BOOLEAN, DOUBLE, LONG,BYTE等待
System.out.println(type1);

System.out.println(integerClass.hashCode());//?
System.out.println(type1.hashCode());//?




}
}
- -

30.通过Class对象获取类的结构信息的相关方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package com.hspedu.reflection;

import org.junit.jupiter.api.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* @author 韩顺平
* @version 1.0
* 演示如何通过反射获取类的结构信息
*/
public class ReflectionUtils {
public static void main(String[] args) {

}
//第二组方法API
@Test
public void api_02() throws ClassNotFoundException, NoSuchMethodException {
//得到Class对象
Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
//getDeclaredFields:获取本类中所有属性
//规定 说明: 默认修饰符 是0 , public 是1 ,private 是 2 ,protected 是 4 , static 是 8 ,final 是 16
Field[] declaredFields = personCls.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println("本类中所有属性=" + declaredField.getName()
+ " 该属性的修饰符值=" + declaredField.getModifiers()
+ " 该属性的类型=" + declaredField.getType());
}

//getDeclaredMethods:获取本类中所有方法
Method[] declaredMethods = personCls.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("本类中所有方法=" + declaredMethod.getName()
+ " 该方法的访问修饰符值=" + declaredMethod.getModifiers()
+ " 该方法返回类型" + declaredMethod.getReturnType());

//输出当前这个方法的形参数组情况
Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println("该方法的形参类型=" + parameterType);
}
}

//getDeclaredConstructors:获取本类中所有构造器
Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("====================");
System.out.println("本类中所有构造器=" + declaredConstructor.getName());//这里老师只是输出名

Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println("该构造器的形参类型=" + parameterType);
}



}

}

//第一组方法API
@Test
public void api_01() throws ClassNotFoundException, NoSuchMethodException {

//得到Class对象
Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
//getName:获取全类名
System.out.println(personCls.getName());//com.hspedu.reflection.Person
//getSimpleName:获取简单类名
System.out.println(personCls.getSimpleName());//Person
//getFields:获取所有public修饰的属性,包含本类以及父类的
Field[] fields = personCls.getFields();
for (Field field : fields) {//增强for
System.out.println("本类以及父类的属性=" + field.getName());
}
//getDeclaredFields:获取本类中所有属性
Field[] declaredFields = personCls.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println("本类中所有属性=" + declaredField.getName());
}
//getMethods:获取所有public修饰的方法,包含本类以及父类的
Method[] methods = personCls.getMethods();
for (Method method : methods) {
System.out.println("本类以及父类的方法=" + method.getName());
}
//getDeclaredMethods:获取本类中所有方法
Method[] declaredMethods = personCls.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("本类中所有方法=" + declaredMethod.getName());
}
//getConstructors: 获取所有public修饰的构造器,包含本类
Constructor<?>[] constructors = personCls.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println("本类的构造器=" + constructor.getName());
}
//getDeclaredConstructors:获取本类中所有构造器
Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("本类中所有构造器=" + declaredConstructor.getName());//这里老师只是输出名
}
//getPackage:以Package形式返回 包信息
System.out.println(personCls.getPackage());//com.hspedu.reflection
//getSuperClass:以Class形式返回父类信息
Class<?> superclass = personCls.getSuperclass();
System.out.println("父类的class对象=" + superclass);//
//getInterfaces:以Class[]形式返回接口信息
Class<?>[] interfaces = personCls.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println("接口信息=" + anInterface);
}
//getAnnotations:以Annotation[] 形式返回注解信息
Annotation[] annotations = personCls.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println("注解信息=" + annotation);//注解
}


}
}

//用于举例的类、接口和方法
class A {
public String hobby;

public void hi() {

}

public A() {
}

public A(String name) {
}
}

interface IA {
}

interface IB {

}

@Deprecated
class Person extends A implements IA, IB {
//属性
public String name;
protected static int age; // 4 + 8 = 12
String job;
private double sal;

//构造器
public Person() {
}

public Person(String name) {
}

//私有的
private Person(String name, int age) {

}

//方法
public void m1(String name, int age, double sal) {

}

protected String m2() {
return null;
}

void m3() {

}

private void m4() {

}
}
- -

31.反射暴破创建实例/操作属性/操作方法

暴破创建实例

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.hspedu.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
* @author 韩顺平
* @version 1.0
* 演示通过反射机制创建实例
*/
public class ReflecCreateInstance {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

//1. 先获取到User类的Class对象
Class<?> userClass = Class.forName("com.hspedu.reflection.User");
//2. 通过public的无参构造器创建实例
Object o = userClass.newInstance();
System.out.println(o);
//3. 通过public的有参构造器创建实例
/*
constructor 对象就是
public User(String name) {//public的有参构造器
this.name = name;
}
*/
//3.1 先得到对应构造器
Constructor<?> constructor = userClass.getConstructor(String.class);
//3.2 创建实例,并传入实参
Object hsp = constructor.newInstance("hsp");
System.out.println("hsp=" + hsp);
//4. 通过非public的有参构造器创建实例
//4.1 得到private的构造器对象
Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
//4.2 创建实例
//暴破【暴力破解】 , 使用反射可以访问private构造器/方法/属性, 反射面前,都是纸老虎
constructor1.setAccessible(true);
Object user2 = constructor1.newInstance(100, "张三丰");
System.out.println("user2=" + user2);
}
}

class User { //User类
private int age = 10;
private String name = "韩顺平教育";

public User() {//无参 public
}

public User(String name) {//public的有参构造器
this.name = name;
}

private User(int age, String name) {//private 有参构造器
this.age = age;
this.name = name;
}

public String toString() {
return "User [age=" + age + ", name=" + name + "]";
}
}
- -

暴破操作属性

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.hspedu.reflection;

import java.lang.reflect.Field;

/**
* @author 韩顺平
* @version 1.0
* 演示反射操作属性
*/
public class ReflecAccessProperty {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {

//1. 得到Student类对应的 Class对象
Class<?> stuClass = Class.forName("com.hspedu.reflection.Student");
//2. 创建对象
Object o = stuClass.newInstance();//o 的运行类型就是Student
System.out.println(o.getClass());//Student
//3. 使用反射得到age 属性对象
Field age = stuClass.getField("age");
age.set(o, 88);//通过反射来操作属性
System.out.println(o);//
System.out.println(age.get(o));//返回age属性的值

//4. 使用反射操作name 属性
Field name = stuClass.getDeclaredField("name");
//对name 进行暴破, 可以操作private 属性
name.setAccessible(true);
//name.set(o, "老韩");
name.set(null, "老韩~");//因为name是static属性,因此 o 也可以写出null
System.out.println(o);
System.out.println(name.get(o)); //获取属性值
System.out.println(name.get(null));//获取属性值, 要求name是static

}
}

class Student {//类
public int age;
private static String name;

public Student() {//构造器
}

public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
- -

暴破操作方法

-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.hspedu.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* @author 韩顺平
* @version 1.0
* 演示通过反射调用方法
*/
public class ReflecAccessMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {

//1. 得到Boss类对应的Class对象
Class<?> bossCls = Class.forName("com.hspedu.reflection.Boss");
//2. 创建对象
Object o = bossCls.newInstance();
//3. 调用public的hi方法
//Method hi = bossCls.getMethod("hi", String.class);//OK
//3.1 得到hi方法对象
Method hi = bossCls.getDeclaredMethod("hi", String.class);//OK
//3.2 调用
hi.invoke(o, "韩顺平教育~");

//4. 调用private static 方法
//4.1 得到 say 方法对象
Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);
//4.2 因为say方法是private, 所以需要暴破,原理和前面讲的构造器和属性一样
say.setAccessible(true);
System.out.println(say.invoke(o, 100, "张三", '男'));
//4.3 因为say方法是static的,还可以这样调用 ,可以传入null
System.out.println(say.invoke(null, 200, "李四", '女'));

//5. 在反射中,如果方法有返回值,统一返回Object , 但是他运行类型和方法定义的返回类型一致
Object reVal = say.invoke(null, 300, "王五", '男');
System.out.println("reVal 的运行类型=" + reVal.getClass());//String


//在演示一个返回的案例
Method m1 = bossCls.getDeclaredMethod("m1");
Object reVal2 = m1.invoke(o);
System.out.println("reVal2的运行类型=" + reVal2.getClass());//Monster


}
}

class Monster {}
class Boss {//类
public int age;
private static String name;

public Boss() {//构造器
}

public Monster m1() {
return new Monster();
}

private static String say(int n, String s, char c) {//静态方法
return n + " " + s + " " + c;
}

public void hi(String s) {//普通public方法
System.out.println("hi " + s);
}
}
- -

打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论
公告
本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
目录
  1. 1.String类的常用方法
  2. 2.StringBufferd类的常用方法
  3. 3.Math类的常用方法
  4. 4.Arrays类的常用方法
  5. 5.System类的常用方法
  6. 6.BigDecimal类和BigInteger类使用(大数处理)
  7. 7.时间类、日期类的常用方法(Date、Calendar,第三代日期类)
  8. 8.实现List接口实现类的常用方法
  9. 9.Map接口的常用方法以及遍历方式
  10. 9.Collections工具类
  11. 10.创建文件的三种方式以及文件的相关操作(相关方法)
  12. 11.FileInputStream 字节输入流
  13. 12.FileOutputStream 字节输出流
  14. 13.文件拷贝(FileInputStream和FileOutputStream)
  15. 14.FileReader 字符输入流
  16. 15.FileWriter 字符输出流
  17. 16.BufferedReader 字符处理流(包装流)
  18. 17.BufferedWriter 字符处理流(包装流)
  19. 18.文件拷贝(BufferedInputStream和BufferedOutputStream)
  20. 19. ObjectOutputStream 序列化操作(对象字节输出流 )保存数据类型和数据
  21. 20.ObjectInputStream 反序列化操作(对象字节输入流 )恢复数据类型和数据
  22. 21.InputStreamReader (转换流 字节流转化成字符流)
  23. 22.OutputStreamWriter(转换流 字节流转成成字符流)
  24. 23.PrintStream(字节打印流)只有输出流,没有输入流
  25. 24.PrintWriter (字符打印流)只有输出流,没有输入流
  26. 25.Properties读取修改配置文件
  27. 26.InetAddress类的常用方法
  28. 27.网络编程相关题目的源码
  29. 28.Class类对象的常用方法举例
  30. 29.获取Class对象的六种方式
  31. 30.通过Class对象获取类的结构信息的相关方法
  32. 31.反射暴破创建实例/操作属性/操作方法
  • 最近更新
    \ No newline at end of file diff --git a/posts/29250.html b/posts/29250.html index 196002c27..9ac77adbb 100644 --- a/posts/29250.html +++ b/posts/29250.html @@ -5,13 +5,13 @@ - + -

    简历模板

    黑马程序员新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题) https://www.bilibili.com/video/BV1yT411H7YK/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584

    + })(window)

    简历模板

    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    FreeMarker模板引擎

    一.FreeMarker介绍

    ​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    + })(window)

    FreeMarker模板引擎

    一.FreeMarker介绍

    ​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    ​ 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

    image-20230816145012534

    技术选型对比

    @@ -379,7 +379,7 @@

    ③ :运行结果

    image-20230816174550953

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    SSM常用配置

    1.pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu.ssm</groupId>
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <!--管理版本信息,将版本信息提取出来,各个依赖的版本通过${spring.version}访问-->
    <properties>
    <spring.version>5.3.1</spring.version>
    </properties>

    <dependencies>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <!--springmvc-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>

    <!-- Mybatis核心 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
    </dependency>

    <!--mybatis和spring的整合包-->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
    </dependency>

    <!-- 连接池 -->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
    </dependency>

    <!-- junit测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.3</version>
    </dependency>

    <!-- log4j日志 -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>

    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
    </dependency>

    <!-- 日志 -->
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    </dependency>

    <!-- ServletAPI -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    </dependency>

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
    </dependency>

    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency>

    <!-- Spring5和Thymeleaf整合包 -->
    <dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.12.RELEASE</version>
    </dependency>

    </dependencies>

    </project>
    - -

    2.spring.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--扫描组件(除控制层)-->
    <context:component-scan base-package="com.atguigu.ssm">
    <!--通过控制层注解的全类名,排除控制层的扫描-->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--引入数据库的配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <!--配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--开启事务的注解驱动-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

    <!--配置SqlSessionFactoryBean,可以直接在IOC容器中获取SqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--获取mybatis的核心配置文件-->
    <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    <!--设置数据源,取代配置文件中的数据源的环境配置-->
    <property name="dataSource" ref="dataSource"></property>
    <!--设置类型别名所对应的包-->
    <property name="typeAliasesPackage" value="com.atguigu.ssm.pojo"></property>
    <!--设置mapper映射文件的路径,在这里我们不需要设置,只有在mapper接口和映射文件的路径不一致时设置-->
    <!-- <property name="mapperLocations" value="classpath:"></property>-->
    </bean>

    <!--
    配置mapper接口扫描,可以将指定包下的所有mapper接口,
    通过SqlSession创建代理实现类对象,
    并将这些对象交给ioc容器管理
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.atguigu.ssm.mapper"></property>
    </bean>

    </beans>
    - -

    3.springmvc.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--组件扫描-->
    <context:component-scan base-package="com.atguigu.ssm.controller"></context:component-scan>

    <!--配置视图解析器-->
    <bean id="viewResolver"
    class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="order" value="1"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="templateEngine">
    <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
    <property name="templateResolver">
    <bean
    class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    <!-- 视图前缀 -->
    <property name="prefix" value="/WEB-INF/templates/"/>
    <!-- 视图后缀 -->
    <property name="suffix" value=".html"/>
    <property name="templateMode" value="HTML5"/>
    <property name="characterEncoding" value="UTF-8" />
    </bean>
    </property>
    </bean>
    </property>
    </bean>

    <!-- 配置访问首页的视图控制 -->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>

    <!-- 配置默认的servlet处理静态资源 -->
    <mvc:default-servlet-handler />

    <!-- 开启MVC的注解驱动 -->
    <mvc:annotation-driven />

    <!--拦截器-->
    <!--
    SpringMVC中的拦截器用于拦截控制器方法的执行
    SpringMVC中的拦截器需要实现HandlerInterceptor
    SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:
    <bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
    <ref bean="firstInterceptor"></ref>
    以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截
    <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/testRequestEntity"/>
    <ref bean="firstInterceptor"></ref>
    </mvc:interceptor>
    以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过
    mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
    -->

    <!--异常处理器-->
    <!--
    <bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
    <props>
    properties的键表示处理器方法执行过程中出现的异常
    properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
    <prop key="java.lang.ArithmeticException">error</prop>
    </props>
    </property>
    exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
    <property name="exceptionAttribute" value="ex"></property>
    </bean>
    -->

    <!--文件上传解析器,是根据id获取目标对象的,id必须是multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
    </beans>
    - -

    4.mybatis-config.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>


    <!--解决数据库中的字段取名为emp_id,而在java中取名为empId,两者无法映射的问题-->
    <!--下划线映射为驼峰-->
    <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--设置分页插件-->
    <plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

    </configuration>
    - -

    5.jdbc.properties

    1
    2
    3
    4
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=hsp
    - -

    6.log4j.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <param name="Encoding" value="UTF-8" />
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
    %m (%F:%L) \n" />
    </layout>
    </appender>
    <logger name="java.sql">
    <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
    <level value="info" />
    </logger>
    <root>
    <level value="debug" />
    <appender-ref ref="STDOUT" />
    </root>
    </log4j:configuration>
    - -

    7.log4j.properties

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    log4j.rootLogger=debug, stdout, R

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    # Pattern to output the caller's file name and line number.
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log

    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=5

    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    \ No newline at end of file diff --git a/posts/3269.html b/posts/3269.html deleted file mode 100644 index d9960d4cb..000000000 --- a/posts/3269.html +++ /dev/null @@ -1,266 +0,0 @@ -FinalShell激活教程 | The Blog - - - - - - - - - - - - -

    FinalShell激活教程

    - -
    -
    - - - - - -
    -
    -
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    \ No newline at end of file diff --git a/posts/32696.html b/posts/32696.html index 7955bc971..e4b982b85 100644 --- a/posts/32696.html +++ b/posts/32696.html @@ -5,13 +5,13 @@ - + -

    Blog

    + })(window)

    Blog

    @@ -202,7 +202,7 @@
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    接口测试工具

    一 Postman的使用

    官网网址: https://www.postman.com/

    + })(window)

    接口测试工具

    一 Postman的使用

    官网网址: https://www.postman.com/

    Postman的首页

    image-20230813162510205

    1 使用教程

    1.1 发送Post请求

    以一个普通的登录操作来演示Postman的使用教程

    @@ -215,7 +215,7 @@

    image-20230813172605624

    下载成功之后打开的效果

    image-20230813172720116

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    对象存储服务MinIO

    一.MinIo基本介绍

    1.简介

    ​ MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。MinIO兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

    + })(window)

    对象存储服务MinIO

    一.MinIo基本介绍

    1.简介

    ​ MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。MinIO兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

    S3 ( Simple Storage Service简单存储服务)

    基本概念

      @@ -337,7 +337,7 @@
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      package com.heima.minio;


      /**
      * @author Jason Gong
      * @version 1.0
      * @website https://jasonsgong.gitee.io
      * @Date 2023/8/18
      * @Description
      */
      @SpringBootTest(classes = MinIOApplication.class)
      @RunWith(SpringRunner.class)
      @Slf4j
      public class MinIOTest {

      @Autowired
      private FileStorageService fileStorageService;

      @Test
      public void testMinIOStarter(){
      //读取一个文件
      try {
      FileInputStream inputStream = new FileInputStream("C:\\Gong\\data\\test.html");
      String s = fileStorageService.uploadHtmlFile("", "test,html", inputStream);
      log.info(s);
      } catch (FileNotFoundException e) {
      e.printStackTrace();
      }
      }
      }

      image-20230818165138917

      -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    技术书籍-Linux指令大全

    Linux命令行与shell脚本编程大全 第三版 ,布鲁姆 ,P606

    PDF

    - -
    - -
    - - - - - - -

    精通Linux 第二版

    PDF

    - -
    - -
    - - - -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    \ No newline at end of file diff --git a/posts/38823.html b/posts/38823.html index f17aca0ec..42504fb84 100644 --- a/posts/38823.html +++ b/posts/38823.html @@ -5,13 +5,13 @@ - + -

    SpringBoot整合EasyExcel

    1.EasyExcel介绍

    ​ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

    + })(window)

    SpringBoot整合EasyExcel

    1.EasyExcel介绍

    ​ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

    官网地址:https://easyexcel.opensource.alibaba.com/

    2.入门

    2.1 引入依赖

    1
    2
    3
    4
    5
    6
    <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
    </dependency>
    @@ -216,7 +216,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    MySql进阶教程

    全部的PDF笔记: https://jasonsgong.gitee.io/posts/50465.html

    + })(window)

    MySql进阶教程

    全部的PDF笔记: https://jasonsgong.gitee.io/posts/50465.html

    原视频地址: 黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

    一.Mysql入门

    1.SQL

    全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。

    1.1 SQL通用语法

    image-20230926220120609

    @@ -685,7 +685,7 @@

    2.将传入的200分制的分数,进行换算,换成百分制,然后返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 2.将传入的200分制的分数,进行换算,换成百分制,然后返回
    create procedure p5(inout score double)
    begin
    set score := score * 0.5;
    end;
    -- 调用(score既是输入又是输出)
    set @score = 78;
    call p5(@score);
    select @score;
    -

    4.2.6 case

    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    目录
    1. 一.Mysql入门
      1. 1.SQL
        1. 1.1 SQL通用语法
        2. 1.2 SQL分类
        3. 1.3 DDL-数据定义语言
        4. 1.4 DML-数据操作语言
        5. 1.5 DQL-数据查询语言
          1. 1.5.1 基础查询
          2. 1.5.2 条件查询
          3. 1.5.3 聚合函数
          4. 1.5.4 分组查询
          5. 1.5.5 排序查询
          6. 1.5.6 分页查询
          7. 1.5.7 DQL语句案例
          8. 1.5.8 执行顺序
        6. 1.6 DCL-数据控制语言
          1. 1.6.1 管理用户
          2. 1.6.2 权限控制
      2. 2.函数
        1. 2.1 字符串函数
        2. 2.2 数值函数
        3. 2.3 日期函数
        4. 2.4 流程函数
      3. 3.约束
        1. 3.1 概述
        2. 3.2 约束演示
        3. 3.3 外键约束
          1. 3.3.1 介绍
          2. 3.3.2 语法
          3. 3.3.3 删除/更新行为
      4. 4.多表查询
        1. 4.1 多表关系
        2. 4.2 多表查询概述
          1. 4.2.1 数据准备
          2. 4.2.2 概述
          3. 4.2.3 分类
        3. 4.3 内连接
        4. 4.4 外连接
        5. 4.5 自连接
        6. 4.6 联合查询
        7. 4.7 子查询
        8. 4.8 多表查询案例
      5. 5.事务
        1. 5.1 事务介绍
        2. 5.2 事务操作
        3. 5.3 事务四大特性
        4. 5.4 并发事务问题
        5. 5.5 事务隔离级别
    2. 二.MySql进阶
      1. 1.存储引擎
        1. 1.1 MySql的体系结构
        2. 1.2 存储引擎简介
        3. 1.3 存储引擎特点
        4. 1.4 存储引擎的选择
      2. 2.索引
        1. 2.1 索引概述
          1. 2.1.1 介绍
          2. 2.1.2 演示
          3. 2.1.3 优缺点
        2. 2.2 索引结构
          1. 2.2.1 索引的数据结构有哪些
          2. 2.2.2 B+树的索引数据结构
          3. 2.2.3 hash的索引数据结构
          4. 2.3.4 思考题
        3. 2.3 索引分类
        4. 2.4 索引语法
        5. 2.5 SQL性能分析
          1. 2.5.1 SQL执行频率
          2. 2.5.2 慢查询日志
          3. 2.5.3 profile详情
          4. 2.5.4 explain执行计划
        6. 2.6 索引使用
          1. 2.6.1 验证索引效率
          2. 2.6.2 最左前缀法则
          3. 2.6.3 索引失效的情况
          4. 2.6.4 SQL提示
          5. 2.6.5 覆盖索引
          6. 2.6.6 前缀索引
          7. 2.6.7 单例索引与联合索引的选择问题
        7. 2.7 索引设计原则
      3. 3.SQL优化
        1. 3.1 插入数据的优化
        2. 3.2 主键优化
        3. 3.3 order by优化
        4. 3.4 group by优化
        5. 3.5 limit优化
        6. 3.6 count优化
        7. 3.7 update优化
        8. 3.8 总结
      4. 4.视图/存储过程/触发器
        1. 4.1 视图
          1. 4.1.1 视图介绍
          2. 4.1.2 语法
          3. 4.1.3 检查选项
          4. 4.1.4 视图更新
          5. 4.1.5 视图作用
          6. 4.1.6 视图案例
        2. 4.2 存储过程
          1. 4.2.1 介绍
          2. 4.2.2 基本语法
          3. 4.2.3 变量
            1. 4.2.3.1 系统变量
            2. 4.2.3.2 用户定义变量
            3. 4.2.3.3 局部变量
          4. 4.2.4 if判断
          5. 4.2.5 参数
          6. 4.2.6 case
    最近更新
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    目录
    1. 一.Mysql入门
      1. 1.SQL
        1. 1.1 SQL通用语法
        2. 1.2 SQL分类
        3. 1.3 DDL-数据定义语言
        4. 1.4 DML-数据操作语言
        5. 1.5 DQL-数据查询语言
          1. 1.5.1 基础查询
          2. 1.5.2 条件查询
          3. 1.5.3 聚合函数
          4. 1.5.4 分组查询
          5. 1.5.5 排序查询
          6. 1.5.6 分页查询
          7. 1.5.7 DQL语句案例
          8. 1.5.8 执行顺序
        6. 1.6 DCL-数据控制语言
          1. 1.6.1 管理用户
          2. 1.6.2 权限控制
      2. 2.函数
        1. 2.1 字符串函数
        2. 2.2 数值函数
        3. 2.3 日期函数
        4. 2.4 流程函数
      3. 3.约束
        1. 3.1 概述
        2. 3.2 约束演示
        3. 3.3 外键约束
          1. 3.3.1 介绍
          2. 3.3.2 语法
          3. 3.3.3 删除/更新行为
      4. 4.多表查询
        1. 4.1 多表关系
        2. 4.2 多表查询概述
          1. 4.2.1 数据准备
          2. 4.2.2 概述
          3. 4.2.3 分类
        3. 4.3 内连接
        4. 4.4 外连接
        5. 4.5 自连接
        6. 4.6 联合查询
        7. 4.7 子查询
        8. 4.8 多表查询案例
      5. 5.事务
        1. 5.1 事务介绍
        2. 5.2 事务操作
        3. 5.3 事务四大特性
        4. 5.4 并发事务问题
        5. 5.5 事务隔离级别
    2. 二.MySql进阶
      1. 1.存储引擎
        1. 1.1 MySql的体系结构
        2. 1.2 存储引擎简介
        3. 1.3 存储引擎特点
        4. 1.4 存储引擎的选择
      2. 2.索引
        1. 2.1 索引概述
          1. 2.1.1 介绍
          2. 2.1.2 演示
          3. 2.1.3 优缺点
        2. 2.2 索引结构
          1. 2.2.1 索引的数据结构有哪些
          2. 2.2.2 B+树的索引数据结构
          3. 2.2.3 hash的索引数据结构
          4. 2.3.4 思考题
        3. 2.3 索引分类
        4. 2.4 索引语法
        5. 2.5 SQL性能分析
          1. 2.5.1 SQL执行频率
          2. 2.5.2 慢查询日志
          3. 2.5.3 profile详情
          4. 2.5.4 explain执行计划
        6. 2.6 索引使用
          1. 2.6.1 验证索引效率
          2. 2.6.2 最左前缀法则
          3. 2.6.3 索引失效的情况
          4. 2.6.4 SQL提示
          5. 2.6.5 覆盖索引
          6. 2.6.6 前缀索引
          7. 2.6.7 单例索引与联合索引的选择问题
        7. 2.7 索引设计原则
      3. 3.SQL优化
        1. 3.1 插入数据的优化
        2. 3.2 主键优化
        3. 3.3 order by优化
        4. 3.4 group by优化
        5. 3.5 limit优化
        6. 3.6 count优化
        7. 3.7 update优化
        8. 3.8 总结
      4. 4.视图/存储过程/触发器
        1. 4.1 视图
          1. 4.1.1 视图介绍
          2. 4.1.2 语法
          3. 4.1.3 检查选项
          4. 4.1.4 视图更新
          5. 4.1.5 视图作用
          6. 4.1.6 视图案例
        2. 4.2 存储过程
          1. 4.2.1 介绍
          2. 4.2.2 基本语法
          3. 4.2.3 变量
            1. 4.2.3.1 系统变量
            2. 4.2.3.2 用户定义变量
            3. 4.2.3.3 局部变量
          4. 4.2.4 if判断
          5. 4.2.5 参数
          6. 4.2.6 case
    最近更新

    技术书籍-java8实战

    java 8实战

    - -
    - -
    - - - -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    最近更新
    \ No newline at end of file diff --git a/posts/46317.html b/posts/46317.html index 938f066a5..29afef8cf 100644 --- a/posts/46317.html +++ b/posts/46317.html @@ -1,17 +1,17 @@ -面试专题 | The Blog +面试专题 | The Blog - + - + - + -

    Java程序设计基础

    韩顺平零基础学java完整版笔记

    - -
    - -
    - - - -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    \ No newline at end of file diff --git a/posts/50465.html b/posts/50465.html index 3b010af20..683305cf2 100644 --- a/posts/50465.html +++ b/posts/50465.html @@ -5,13 +5,13 @@ - + -

    MySql基础进阶运维篇PDF笔记

    1.PDF笔记

    1.1MySql基础篇PDF笔记

    + })(window)

    MySql基础进阶运维篇PDF笔记

    1.PDF笔记

    1.1MySql基础篇PDF笔记

    @@ -219,7 +219,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    ElementUI使用示例

    ElementUI官网

    + })(window)

    ElementUI使用示例

    ElementUI官网

    一.树形显示-树形控件

    1.树形显示

    示例-以谷粒商城项目的商品分类为例

    数据中商品分类的数据表,所有的分类数据在同一张表中

    image-20230530174911409 @@ -240,7 +240,7 @@

    实现的效果

    image-20230605163004850

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    常用的DOS命令

    1.一些基础的DOS命令

    1
    c:\javacode>dir	  //查看C盘javacode目录下有那些文件
    + })(window)

    常用的DOS命令

    1.一些基础的DOS命令

    1
    c:\javacode>dir	  //查看C盘javacode目录下有那些文件
    1
    c:\javacode>cd /D d:   //从C盘切换到D盘
    @@ -206,7 +206,7 @@

    3.MySql的相关DOS命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //开启MySQL和关闭MySQL服务
    >net start mysql //开
    >new stop mysql //关


    //登录mysql的命令
    >mysql -u 用户名 -p密码 //密码可以先不输入,直接回车输入,或者直接写在p的后面,中间不要空格



    //连接mysql服务(mysql数据库)的指令
    >mysql -h 主机ip -P端口 -u 用户名 -p密码
    //tips:
    //p和密码中间不要有空格
    //-p后面没有密码的话,会让回车的时候输入密码
    //如果没有写-h主机,默认就是本机
    //如果没有写-P端口,默认就是3306
    //在实际的工作中端口一般会修改,使用3306这一端口,容易被黑客发现并攻击





    //备份数据库的命令
    //备份整个数据库
    >mysqldump -u root -p -B 数据库 数据库 > c:\\test\\bak.sql
    //备份数据库的某个表
    >mysqldump -u root -p 数据库 表1 表2 表n > c:\\test\\bak.sql
    //这里就是把数据库hsp_db02 和数据库hsp_db03备份在C盘下面test目录中一个叫bak.sql的文件中,这里备份的是sql语句




    //根据备份的文件,恢复数据库
    //第一种方式
    >source c:\\test\\bak.sql //根据C盘下面的c:\\test\\bak.sql的文件恢复数据库
    //第二种方式
    //直接把这个.sql的文件再执行一遍,就会恢复两个数据库了

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    开源项目-若依框架

    一.若依简介

    官网简介

    + })(window)

    开源项目-若依框架

    一.若依简介

    官网简介

    RuoYi 是一个后台管理系统,主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

    单体版本技术栈:Spring Boot、Apache Shiro、MyBatis、Thymeleaf

    前后端分离版本技术栈:SpringBoot、Spring Security、Jwt、Vue

    @@ -245,7 +245,7 @@
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    handleLogin() {
    this.$refs.loginForm.validate(valid => {
    if (valid) {
    this.loading = true;
    if (this.loginForm.rememberMe) {
    Cookies.set("username", this.loginForm.username, { expires: 30 });
    Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
    Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
    } else {
    Cookies.remove("username");
    Cookies.remove("password");
    Cookies.remove('rememberMe');
    }
    this.$store.dispatch("Login", this.loginForm).then(() => {
    this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
    }).catch(() => {
    this.loading = false;
    if (this.captchaEnabled) {
    this.getCode();
    }
    });
    }
    });
    }

    4.后端登录的实现逻辑

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    Mybatis-Plus的使用教程

    官方文档:MyBatis-Plus

    + })(window)

    Mybatis-Plus的使用教程

    官方文档:MyBatis-Plus

    常用插件

    1.公共字段填充

    对于每个实体类共有的属性字段,例如创建时间、修改时间、创建人、修改人,我们可以使用公共字段填充,来统一填充这些字段,这样我们在创建这些实体类的对象的时候就不需要set这些属性,实现丝滑开发

    1
    2
    3
    4
    @TableField(fill = FieldFill.INSERT) //插入的时候填充
    private String gmtCreate;
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入和修改的时候填充
    private String gmtModified;
    @@ -209,7 +209,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    Hive中使用UDF函数的简单示例

    一.UDF函数介绍

    ​ UDF:user difine function,用户自定义函数,在Hive的使用中,系统内置函数有时无法满足业务需求,这时就需要开发者自己编写函数来实现业务需求。

    -

    二.简单示例

    1.创建一个maven工程

    前置条件: Java环境,Maven环境,IDEA开发工具

    -

    2.在pom.xml文件中引入udf的依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>0.13.1</version>
    </dependency>
    - -

    3.编写udf函数

    创建一个java类继承UDF类,实现evaluate()方法,evaluate()方法可以重载

    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import org.apache.hadoop.hive.ql.exec.UDF;

    public class MyUDF extends UDF{

    //计算两个年龄的差值
    public int evaluate(int firstAge, int secondAge){
    return secondAge - firstAge;
    }

    //根据身份证号提取生日信息
    public String evaluate(String idNumber) {
    if ((idNumber != null) && idNumber.length() == 18 && Pattern.matches("^[0-9]+$", idNumber)) {
    String year = idNumber.substring(6).substring(0, 4);// 得到年份
    String month = idNumber.substring(10).substring(0, 2);// 得到月份
    String day = idNumber.substring(12).substring(0, 2);// 得到日
    return year + "-" + month + "-" + day;
    }
    return "";
    }
    }
    - -

    4.将项目打成jar包上传到hdfs中

    使用maven工具先clean再package,然后将target目录下的jar包上传到hdfs中

    -

    5.在hive中创建udf函数

    1
    2
    drop function if  exists MyUDF;
    create function MyUDF as 'com.udf.MyUDF' using jar 'hdfs://xx/xxx.jar';
    - -

    6.测试使用

    1
    2
    select MyUDF(1,3); -- 2
    select MyUDF('659452200103056489'); -- 2001-03-05
    - -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    \ No newline at end of file diff --git a/posts/54835.html b/posts/54835.html index 23092f7a5..c4c11af10 100644 --- a/posts/54835.html +++ b/posts/54835.html @@ -5,13 +5,13 @@ - + -

    Thymeleaf教程

    Thymeleaf 是一个服务器端 Java 模板引擎,能够处理 HTML、XML、CSS、JAVASCRIPT 等模板文件。Thymeleaf 模板可以直接当作静态原型来使用,它主要目标是为开发者的开发工作流程带来优雅的自然模板,也是 Java 服务器端 HTML5 开发的理想选择。

    + })(window)

    Thymeleaf教程

    Thymeleaf 是一个服务器端 Java 模板引擎,能够处理 HTML、XML、CSS、JAVASCRIPT 等模板文件。Thymeleaf 模板可以直接当作静态原型来使用,它主要目标是为开发者的开发工作流程带来优雅的自然模板,也是 Java 服务器端 HTML5 开发的理想选择。

    image-20230706152329777

    教程: https://www.thymeleaf.org

    项目集成Thymeleaf

    1.导入依赖

    @@ -231,7 +231,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    Linux运维管理面板-1Panel

    一.官方文档

    官网:1Panel - 现代化、开源的 Linux 服务器运维管理面板

    + })(window)

    Linux运维管理面板-1Panel

    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    SSM框架基础知识及整合

    PDF版本的笔记

    + })(window)

    SSM框架基础知识及整合

    PDF版本的笔记

    Mybatis

    @@ -208,7 +208,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    最近更新
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    免费域名注册教程

    一.域名注册

    免费域名注册网址:https://nic.eu.org

    + })(window)

    免费域名注册教程

    一.域名注册

    免费域名注册网址:https://nic.eu.org

    image-20230913123344514

    1.注册账号

    第一步:点击: here

    image-20230913123704246

    @@ -214,7 +214,7 @@

    点击Submit按钮之后显示如下的内容表示这个免费的域名是可以申请到的,然后等待人工审核通过

    image-20230913132918535

    审核通过之后,你注册时使用的邮箱就会收到信息

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    OCR-图片文字识别

    一.什么是OCR

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程

    + })(window)

    OCR-图片文字识别

    一.什么是OCR

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程

    @@ -237,7 +237,7 @@

    2.配置文件中添加配置

    1
    2
    3
    tess4j:
    data-path: C:\workspace\tessdata # 字体库的路径
    language: chi_sim # 识别的字体d
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    SpringBoot入门教程

    尚硅谷雷丰阳的SpringBoot零基础入门教程

    + })(window)

    SpringBoot入门教程

    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    目录
    1. 一.SpringBoot2核心技术-基础入门
      1. 1.Spring能做什么
      2. 2.SpringBoot
        1. 2.1 SpringBoot的优点
        2. 2.2、SpringBoot缺点
        3. 2.3 官方文档
      3. 3.SpringBoot入门
        1. 1.系统的要求
        2. 2.HelloWorld
        3. 3.简化配置
        4. 4.简化部署
      4. 4.了解自动装配原理
        1. 4.1 依赖管理
          1. 1.SpringBoot的自动版本仲裁机制
          2. 2.Starters场景启动器
        2. 4.2 自动配置
        3. 4.3 容器功能
          1. 1.组件添加
            1. 1.1 @Configuration
            2. 1.2 @Bean @Component @Controller @Service @Repository
            3. 1.3 @ComponentScan @Import
            4. 1.4 @Conditional 条件装配:满足Conditional指定的条件,则进行组件注入
          2. 2.原生配置文件的引入
            1. 2.1、@ImportResource
          3. 3.配置绑定
            1. 3.1 @ConfigurationProperties
        4. 4.4 自动配置原理入门
          1. 1.引导加载自动配置类
          2. 2.按需开启自动配置项
          3. 3.修改默认配置
          4. 3.4.最佳实践
        5. 4.5 简化开发
          1. 1.Lombok
          2. 2.简化日志开发
        6. 3.dev-tools
        7. 4.Spring Initailizr(项目初始化向导)
    2. 二.SpringBoot2核心技术-核心功能
      1. 一.配置文件
        1. 1、文件类型
          1. 1.1、properties
          2. 1.2、yaml
            1. 1.2.1、简介
            2. 1.2.2、基本语法
            3. 1.2.3、数据类型
            4. 1.2.4、示例
        2. 2、配置提示
      2. 二.Web开发
        1. 1.简单的功能分析
          1. 1.1 静态资源访问
            1. 1.静态资源目录
            2. 2.静态资源访问前缀
            3. 3.webjar
          2. 1.2 欢迎页支持
          3. 1.3 自定义 Favicon
          4. 1.4 静态资源配置原理
        2. 2.请求参数处理与数据响应
          1. 2.1、请求映射
            1. 1、rest使用与原理
            2. 2、请求映射原理
          2. 2.2、普通参数与基本注解
            1. 1.注解
            2. 2.Servlet API
            3. 3.复杂参数:
            4. 4.自定义对象参数
          3. 2.3 参数处理原理
          4. 2.4 数据响应与内容协商
            1. 2.4.1 相关依赖的引入
            2. 2.4.2 内容协商原理
            3. 2.4.3 自定义MessageConverter
        3. 3.视图解析与模板引擎
          1. 3.1 视图解析
          2. 3.2 模板引擎-Thymeleaf
            1. 3.2.1 Thymeleaf的使用
          3. 3.3 后台管理系统注意点
        4. 4.拦截器
          1. 1.HandlerInterceptor接口
          2. 2.拦截器实现登录检查操作
          3. 3.拦截器原理
        5. 5.文件上传
          1. 1.页面表单
          2. 2.文件上传代码
          3. 3.MultipartAutoConfiguration
        6. 6.异常处理
          1. 1.默认规则
          2. 2.自定义错误页面
        7. 7.Web原生组件注入(Servlet、Filter、Listener)
          1. 7.1 使用Servlet Api
            1. 1.原生的Servlet的使用
            2. 2.原生的Filter的使用
            3. 3.原生的Listener的使用
          2. 7.2 使用RegistrationBean
        8. 8.嵌入式Servlet容器
          1. 8.1 切换嵌入式Servlet容器
          2. 8.2 定制Servlet容器
      3. 三.数据访问
        1. 1.SQL
          1. 1.1 JDBC的使用
          2. 1.2 分析自动配置
      4. 四.单元测试
        1. 1.JUnit5的变化
        2. 2.JUnit5常用注解
        3. 3.断言
          1. 3.1 简单断言
          2. 3.2 数组断言
          3. 3.3 组合断言
          4. 3.4 异常断言
          5. 3.5 超时断言
          6. 3.6 快速失败
        4. 4.前置条件
        5. 5.嵌套测试
        6. 6.参数化测试
        7. 7.迁移指南
      5. 五.指标监控
        1. 1.SpringBoot Actuator
          1. 1.1 如何使用
          2. 1.2 常用的EndPoints
          3. 1.3 Health Endpoint
          4. 1.4 Metrics Endpoint
          5. 1.5 管理Endpoint
          6. 1.6 定制Endpoint
            1. 1.6.1 定制health endpoint
            2. 1.6.2 定制 info endpoint
            3. 1.6.3 定制Metrics信息
          7. 1.7 新增Endpoint
          8. 1.8 可视化
      6. 六.原理解析
        1. 1.Profile功能
    最近更新
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    目录
    1. 一.SpringBoot2核心技术-基础入门
      1. 1.Spring能做什么
      2. 2.SpringBoot
        1. 2.1 SpringBoot的优点
        2. 2.2、SpringBoot缺点
        3. 2.3 官方文档
      3. 3.SpringBoot入门
        1. 1.系统的要求
        2. 2.HelloWorld
        3. 3.简化配置
        4. 4.简化部署
      4. 4.了解自动装配原理
        1. 4.1 依赖管理
          1. 1.SpringBoot的自动版本仲裁机制
          2. 2.Starters场景启动器
        2. 4.2 自动配置
        3. 4.3 容器功能
          1. 1.组件添加
            1. 1.1 @Configuration
            2. 1.2 @Bean @Component @Controller @Service @Repository
            3. 1.3 @ComponentScan @Import
            4. 1.4 @Conditional 条件装配:满足Conditional指定的条件,则进行组件注入
          2. 2.原生配置文件的引入
            1. 2.1、@ImportResource
          3. 3.配置绑定
            1. 3.1 @ConfigurationProperties
        4. 4.4 自动配置原理入门
          1. 1.引导加载自动配置类
          2. 2.按需开启自动配置项
          3. 3.修改默认配置
          4. 3.4.最佳实践
        5. 4.5 简化开发
          1. 1.Lombok
          2. 2.简化日志开发
        6. 3.dev-tools
        7. 4.Spring Initailizr(项目初始化向导)
    2. 二.SpringBoot2核心技术-核心功能
      1. 一.配置文件
        1. 1、文件类型
          1. 1.1、properties
          2. 1.2、yaml
            1. 1.2.1、简介
            2. 1.2.2、基本语法
            3. 1.2.3、数据类型
            4. 1.2.4、示例
        2. 2、配置提示
      2. 二.Web开发
        1. 1.简单的功能分析
          1. 1.1 静态资源访问
            1. 1.静态资源目录
            2. 2.静态资源访问前缀
            3. 3.webjar
          2. 1.2 欢迎页支持
          3. 1.3 自定义 Favicon
          4. 1.4 静态资源配置原理
        2. 2.请求参数处理与数据响应
          1. 2.1、请求映射
            1. 1、rest使用与原理
            2. 2、请求映射原理
          2. 2.2、普通参数与基本注解
            1. 1.注解
            2. 2.Servlet API
            3. 3.复杂参数:
            4. 4.自定义对象参数
          3. 2.3 参数处理原理
          4. 2.4 数据响应与内容协商
            1. 2.4.1 相关依赖的引入
            2. 2.4.2 内容协商原理
            3. 2.4.3 自定义MessageConverter
        3. 3.视图解析与模板引擎
          1. 3.1 视图解析
          2. 3.2 模板引擎-Thymeleaf
            1. 3.2.1 Thymeleaf的使用
          3. 3.3 后台管理系统注意点
        4. 4.拦截器
          1. 1.HandlerInterceptor接口
          2. 2.拦截器实现登录检查操作
          3. 3.拦截器原理
        5. 5.文件上传
          1. 1.页面表单
          2. 2.文件上传代码
          3. 3.MultipartAutoConfiguration
        6. 6.异常处理
          1. 1.默认规则
          2. 2.自定义错误页面
        7. 7.Web原生组件注入(Servlet、Filter、Listener)
          1. 7.1 使用Servlet Api
            1. 1.原生的Servlet的使用
            2. 2.原生的Filter的使用
            3. 3.原生的Listener的使用
          2. 7.2 使用RegistrationBean
        8. 8.嵌入式Servlet容器
          1. 8.1 切换嵌入式Servlet容器
          2. 8.2 定制Servlet容器
      3. 三.数据访问
        1. 1.SQL
          1. 1.1 JDBC的使用
          2. 1.2 分析自动配置
      4. 四.单元测试
        1. 1.JUnit5的变化
        2. 2.JUnit5常用注解
        3. 3.断言
          1. 3.1 简单断言
          2. 3.2 数组断言
          3. 3.3 组合断言
          4. 3.4 异常断言
          5. 3.5 超时断言
          6. 3.6 快速失败
        4. 4.前置条件
        5. 5.嵌套测试
        6. 6.参数化测试
        7. 7.迁移指南
      5. 五.指标监控
        1. 1.SpringBoot Actuator
          1. 1.1 如何使用
          2. 1.2 常用的EndPoints
          3. 1.3 Health Endpoint
          4. 1.4 Metrics Endpoint
          5. 1.5 管理Endpoint
          6. 1.6 定制Endpoint
            1. 1.6.1 定制health endpoint
            2. 1.6.2 定制 info endpoint
            3. 1.6.3 定制Metrics信息
          7. 1.7 新增Endpoint
          8. 1.8 可视化
      6. 六.原理解析
        1. 1.Profile功能
    最近更新

    Java爬虫

    视频教程1: 狂神说Java Jsoup爬虫入门实战 https://www.bilibili.com/video/BV1La4y1x7Wm?vd_source=aee5e475191b69e6c781059ab6662584

    + })(window)

    Java爬虫

    视频教程1: 狂神说Java Jsoup爬虫入门实战 https://www.bilibili.com/video/BV1La4y1x7Wm?vd_source=aee5e475191b69e6c781059ab6662584

    视频教程2:https://www.bilibili.com/video/BV1RU4y147eZ?vd_source=aee5e475191b69e6c781059ab6662584

    具体的看视频 急速入门

    入门实战教程

    1.引入依赖

    1
    2
    3
    4
    5
    6
    <!-- 爬取视频或者音频需要使用别的依赖 -->
    <dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
    </dependency>
    @@ -207,7 +207,7 @@

    image-20230509233922789

    image-20230509234019249

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    xShell自定义配色方案

    自定义配色方案

    -

    20230321180350

    -

    20230321180405

    -

    字体大小的设置

    -

    20230321180420

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    最近更新
    \ No newline at end of file diff --git a/posts/62429.html b/posts/62429.html index f0eae3002..aaeec247c 100644 --- a/posts/62429.html +++ b/posts/62429.html @@ -5,13 +5,13 @@ - + -

    SpringCloud相关资料

    SpringCloud相关资料

    一.Eureka注册中心、Ribbon负载均衡、Nacos注册中心

    + })(window)

    SpringCloud相关资料

    SpringCloud相关资料

    一.Eureka注册中心、Ribbon负载均衡、Nacos注册中心

    @@ -224,7 +224,7 @@ -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    公告
    本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站!

    Java生成二维码

    SpringBoot + zxing 生成二维码

    + })(window)

    Java生成二维码

    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    阿里云对象存储OSS

    1.官网介绍

    ​ 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。

    + })(window)

    阿里云对象存储OSS

    1.官网介绍

    ​ 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。

    2.使用

    2.1 使用的前置准备

    (1)申请阿里云账号
    (2)实名认证
    (3)开通“对象存储OSS”服务
    (4)进入管理控制台

    2.2 创建Bucket

    点击创建Bucket

    image-20230422210404204

    @@ -261,7 +261,7 @@

    image-20230612114314757

    解决方法

    image-20230612114238391

    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    开发环境的搭建

    1.后端环境搭建

    1.1 JDK环境的配置

    常规的安装,无需教程

    + })(window)

    开发环境的搭建

    1.后端环境搭建

    1.1 JDK环境的配置

    常规的安装,无需教程

    IDEA中设置默认的JDK

    image-20230604120610791

    选中需要设置为默认JDK的JDK

    @@ -231,7 +231,7 @@

    3.前后端公共环境的搭建

    1.Git环境的搭建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #以下的操作在下载安装完毕之后进行
    #1.鼠标在桌面右键 选择Git Bash Here 打开控制台

    #2.配置用户名和邮箱
    git config --global user.name "用户名" #随意
    git config --global user.email "邮箱" #自己的邮箱

    #3.配置SSH免密连接
    #生成密钥
    ssh-keygen -t rsa -C "在码云上注册的邮箱地址" #连续三次回车
    #查看密钥并复制公钥的内容
    cat ~/.ssh/id_rsa.pub

    #4.将密钥的复制到码云的SSH公钥中
    #4.1添加公钥 公钥名随意 公钥内容就是上面复制的内容

    #5.测试
    ssh -T git@gitee.com
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论

    Java学习路线

    - -
    -
    - - - - - -
    -
    -
    -
    打赏
    • 微信
      微信
    • 支付宝
      支付宝

    评论
    \ No newline at end of file diff --git a/posts/63724.html b/posts/63724.html index 866a9c84d..7505788bd 100644 --- a/posts/63724.html +++ b/posts/63724.html @@ -5,13 +5,13 @@ - + - + -
    标签 - FinalShell
    2023
    FinalShell激活教程
    FinalShell激活教程
    \ No newline at end of file diff --git a/tags/FreeMarker/index.html b/tags/FreeMarker/index.html index b040196e1..41f3e5483 100644 --- a/tags/FreeMarker/index.html +++ b/tags/FreeMarker/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
    标签 - Hive
    2023
    Hive中使用UDF函数的简单示例
    Hive中使用UDF函数的简单示例
    \ No newline at end of file diff --git a/tags/Java/index.html b/tags/Java/index.html index d50e88932..81c77b601 100644 --- a/tags/Java/index.html +++ b/tags/Java/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
    标签 - WebSocket
    2024
    WebSocket使用案例
    WebSocket使用案例
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index ebe80ada9..6573e7c39 100644 --- a/tags/index.html +++ b/tags/index.html @@ -5,12 +5,12 @@ - + -
    标签 - 学习路线
    2023
    Java学习路线
    Java学习路线
    \ No newline at end of file diff --git a/tags/工具/index.html b/tags/工具/index.html index 24fab659f..53c0d0d7c 100644 --- a/tags/工具/index.html +++ b/tags/工具/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
    标签 - 技术书籍
    2023
    技术书籍-Linux指令大全
    技术书籍-Linux指令大全
    技术书籍-java8实战
    技术书籍-java8实战
    \ No newline at end of file diff --git a/tags/插件/index.html b/tags/插件/index.html index 1a0a263ea..16c15ee57 100644 --- a/tags/插件/index.html +++ b/tags/插件/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }
    标签 - 细节知识
    2023
    细节知识
    细节知识
    \ No newline at end of file diff --git a/tags/网络/index.html b/tags/网络/index.html index ddca29e7f..fa3286fdc 100644 --- a/tags/网络/index.html +++ b/tags/网络/index.html @@ -62,7 +62,7 @@ isHome: false, isHighlightShrink: false, isToc: false, - postUpdate: '2024-03-29 13:24:35' + postUpdate: '2024-04-02 11:00:30' }