SFTP文件上传工具类
SFTP文件上传工具类123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286import cn.hutool.crypto.SecureUtil;import com.jcraft.jsch.*;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.ObjectUtils;import java.io.*;import java.nio.file.Files;import java.util.Arra ...
Spring的常用注解
https://blog.csdn.net/guorui_java/article/details/107347754
ttps://blog.csdn.net/guorui_java/article/details/107347754
原文:https://blog.csdn.net/guorui_java/article/details/107347754
一、Spring的常用注解1、给容器中注入组件(1)包扫描+组件标注注解
@Component:泛指各种组件
@Controller、@Service、@Repository都可以称为@Component。
@Controller:控制层
@Service:业务层
@Repository:数据访问层
(2)@Bean
导入第三方包里面的注解
(3)@Import
@Import(要导入到容器中的组件);
123456789@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})public class MainConfig2 { @Scope("prototype") @Bean("person") public Person person() { System.out.println("我是Person"); return new Person("素小暖",25); }}
@ImportSelector:返回需要导入的组件的全类名数组;
123456789public class MyImportSelector implements ImportSelector { //返回值就是导入容器的组件全类目 // AnnotationMetadata 当前标注@Import注解的类的所有注解信息 public String[] selectImports(AnnotationMetadata importingC ...
CDN加速静态资源
5月19号的时候 搭建的GitHub图床图片访问不了了,发现是原来的CDN(jsDelivr)加速被墙了,gitee听说禁止用来做图床,会被封;
然后又是替换原来博客主题(Butterfly)的 js地址,又是搞图床,图床试了下腾讯的cos,发现存储要收费,访问流量要收费,操作图片也要收费,虽然费用不高,但是还是有点不爽(没办法白嫖);
虽然5月21号上午 jsdelivr已经恢复了,但是忧患意识还是要有的,搜了下其他免费的CDN,看了一圈,国内的虽然有免费的,但是要注册,国外的直接替换地址就可以了,还是外国的老爷们大方,记录下国内外的CDN吧,我只是搬运工;
目前只是用作GitHub的,其他用途没试过。
1. JsDelivr(1)GitHub原地址:
https://raw.githubusercontent.com/unravelyt/image-hosting/master/base_img/avatar.4zr2jgjmhq80.webp
(2)替换后:
经常失效不推荐:https://cdn.jsdelivr.net/gh/unravelyt/image-hosting**@**master/base_img/avatar.4zr2jgjmhq80.webp
推荐使用:https://fastly.jsdelivr.net/gh/unravelyt/image-hosting@master/2022/SecurityContextHolder.637wmh9seyg0.png
(3)替换规则:
/unravelyt/image-hosting/master/base_img/avatar.4zr2jgjmhq80.webp
对应关系:
unravelyt = GitHub用户id
image-hosting = 仓库名称
master = 仓库分支
base_img = 文件夹名称
avatar.4zr2jgjmhq80.webp = 文件名称
将https://raw.githubusercontent.com/替换为https://cdn.jsdelivr.net/gh/ 或者https://fastly.jsdelivr.net/gh/
将/ma ...
frp实现内网穿透
背景:
工作和在家学习时会用到很多中间件,想要一个稳定的开发环境,直接买个32G内存的服务器太贵了,所以买了迷你主机装了Ubuntu当做服务器,那就需要解决外网访问问题,这里就涉及到内网穿透。
内网穿透方式:
自建:frp(推荐),localhost.run,gost,nps
购买:花生壳,pubyun,ngrok,路由侠
准备:一台Ubuntu系统主机,一台有公网IP的主机
1. frp工作原理
2. frp压缩包文件说明
下载frp文件包
frp文档
每个压缩包解压后都包含以下文件和一个systemd文件夹:
frpc —— 客户端可执行二进制文件
frpc_full.ini —— 包含全部配置项的客户端配置文件
frpc.ini —— 客户端使用的配置文件,包含最简配置
frps —— 服务端可执行二进制文件
frps_full.ini —— 包含全部配置项的服务端配置文件
frps.ini —— 服务端使用的配置文件,包含最简配置
systemd —— 文件夹,用于将frpc和frps添加为服务的配置,linux下使用systemd作为守护程序、mac os使用launchd作为守护程序
注:服务端只需用到frp_0.46.1_linux_amd64目录下的frps相关文件,本机(客户端)只需用到frp_0.46.1_linux_amd64目录下的frpc相关文件
3. 服务端配置(公网服务器)3.1 解压12345678# 一般放到opt目录下cd /opt# 解压tar -zxvf frp_0.46.0_linux_amd64.tar.gz# 编辑配置文件,注意是frpsvim frps.ini
3.2 配置文件12345678910111213141516171819202122232425262728293031323334# 输入如下内容[common]# frp监听的端口,默认是7000,可以改成其他的bind_port = 7000# frp管理后台端口,请按自己需求更改dashboard_port = 7500# frp管理后台用户名和密码,请改成自己的dashboard_user = xxxdashboard_pwd = xxxx# token在客户端会用到token = frp_token# http穿透端口vh ...
部署Picx图床
根据 免费的GitHub图床PicX 整理,替换镜像源
1. 下载代码123git clone https://github.com/XPoet/picx.gitcd picx
2 创建dockerfile文件12345678910111213141516171819# build stageFROM node:lts-alpine as build-stageLABEL maintainer=unravely<xxxx@163.com>WORKDIR /appCOPY package*.json ./#这里用淘宝镜像,不然会卡住RUN npm install -g cnpm --registry=https://registry.npm.taobao.orgRUN cnpm installRUN cnpm install pm2 -gCOPY . .RUN npm run build# production stageFROM nginx:stable-alpine as production-stageCOPY --from=build-stage /app/dist /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]
3. 构建镜像1docker build -t unravely/pixc:v1 .
4. 启动服务1docker run -d --name=picx --restart=always -p 3480:80 unravely/pixc:v1
5.访问访问地址:http://ip:3480
ps:也可以直接去(Docker Hub)搜索pixc,直接拉取镜像,然后运行;
CountDownLatch使用
CountDownLatch用于主线程和子线程协同配合,常用2种使用方式:
主线程等待所有的子线程完成任务后再执行
所有的子线程准备,等待主线程发令执行
用法一:主线程等子线程12345678910111213141516171819private static void m2() throws InterruptedException { CountDownLatch countDownLatch2 = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { try { String name = Thread.currentThread().getName(); System.out.println("子线程"+name+"执行任务中..."); Thread.sleep(1000 + ThreadLocalRandom.current().nextInt(2000)); System.out.println("子线程"+name+"完成任务"); countDownLatch2.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } System.out.println("主线程等待中...."); countDownLatch2.await();// 主线程在阻塞,当计数器==0,就唤醒主线程往下执行。 System.o ...
IO流与byte[]互转
1. 将File转换为byte[]数组123//java.nio.fileString filePath = "C:\\Users\\user\\Pictures\\22.jpg";byte[] bytes = Files.readAllBytes(Paths.get(filePath));
2. 将FileInputStream 转换为byte[]数组方式1:
1234String filePath = "C:\\Users\\user\\Pictures\\22.jpg";FileInputStream inputStream = new FileInputStream(filePath);byte[] bytes1 = new byte[fileInputStream.available()];fileInputStream.read(bytes1);
方式2:
12//使用Apache Common中IOUtils.toByteArray()转换byte[] bytes = IOUtils.toByteArray(inputStream);
方式3:
123456789String filePath = "C:\\Users\\user\\Pictures\\22.jpg";FileInputStream fileInputStream = new FileInputStream(filePath);ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] bytes = new byte[4096];int n = 0;while (-1 != fileInputStream.read(bytes)) { output.write(bytes);}byte[] bytes2 = output.toByteArray();
方式4:
12//使用Google Guava中ByteStreams.toByteArray()转换byte[] bytes = ByteStreams.toByteArray(inputStream);
方式5(jdk9):
1byte[] bytes = input ...