ApplicationPreparedEvent 监听事件

Event published once the application context has been refreshed but before any
{@link ApplicationRunner application} and {@link CommandLineRunner command line}
runners have been called. Spring Boot 2.0 版本中所有的事件按执行的先后顺序如下: ApplicationStartingEvent ApplicationEnvironmentPreparedEvent ApplicationPreparedEvent ApplicationStartedEvent <= 新增的事件 ApplicationReadyEvent ApplicationFailedEvent @Configuration
@Order(Ordered.HIGHEST_PRECEDENCE) //最高优先级,最先执行
public class StartedListener implements ApplicationListener<ApplicationStartedEvent> { @Override
public void onApplicationEvent(ApplicationStartedEvent event) {
//打印博客地址
this.printStartInfo();
//初始化主题
this.initThemes();
}
}

Path、Paths、Files

Path类可用于在文件系统中定位文件的对象,它通常表示系统相关的文件路径:

	getRoot()	//返回此路径的根组分作为 Path 对象,或 null(如果该路径不具有根组件)("E:\迅雷下载"返回"E:\")

	toAbsolutePath()	//返回表示此路径的绝对路径的 Path 对象

	getNameCount()	//返回路径中的名称元素的数量("E:\迅雷下载"返回"1")

	resolve()

		把当前路径当成父目录,而把参数中的路径当成子目录或是其中的文件,进行解析之后得到一个新路径。

	resolveSibling()

		方法的作用与 resolve 方法类似,只不过把当前路径的父目录当成解析时的父目录。

	relativize()

		方法的作用与 resolve 方法正好相反,用来计算当前路径相对于参数中给出的路径的相对路径。

	subpath()

		方法用来获取当前路径的子路径,参数中的序号表示的是路径中名称元素的序号。

	startsWith()和endsWith()

		方法用来判断当前路径是否以参数中的路径开始或结尾。

	在一般的路径中,“.”和“..”分别用来表示当前目录和上一级目录。

    Path path1 = Paths.get("folder1", "sub1");
Path path2 = Paths.get("folder2", "sub2");
path1.resolve(path2); folder1\sub1\folder2\sub2
path1.resolveSibling(path2); folder1\folder2\sub2
path1.relativize(path2); ..\..\folder2\sub2
path1.subpath(0, 1); folder1 path.normalize()
normalize()方法可以标准化路径,它会处理路径中的相对路径,去除"."".."
原:path = c:\ld\.\test
新:path = c:\ld\test public final class Paths { private Paths() {} //将路径字符串或连接到路径字符串的字符串序列转换为 Path
public static Path get(String first, String... more) {
return Path.of(first, more);
} //将给定的URI转换为Path对象
public static Path get(URI uri) {
return Path.of(uri);
}
} Files工具类:
旧的IO中的操作文件的类是File,但是File类只能操作文件(创建,删除,修改属性等),但是不能修改文件的内容。
Files工具类可以直接写文件。 File工具类通常需要结合Path对象来使用: 拷贝文件 copy(...) 有3个重载方法,通常需要跟Path结合使用 操作文件 createDirectories(Path dir, FileAttribute<?>... attrs) //首先创建所有不存在的父目录来创建目录 createDirectory(Path dir, FileAttribute<?>... attrs) //创建一个新的目录 createFile(Path path, FileAttribute<?>... attrs) //创建一个新的和空的文件,如果该文件已存在则失败 delete(Path path) //删除文件 判断属性 isHidden(Path path) //告知文件是否被 隐藏 isReadable(Path path) //测试文件是否可读 isDirectory(Path path, LinkOption... options) //测试文件是否是目录

复制文件夹及文件(Files)

package java.nio.file.Files:

	public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)

	1) 在旧版本中遍历文件系统只能通过递归的方法来实现,但是这种方法不仅消耗资源大而且效率低

    2) NIO.2 的 Files 工具类提供了一个静态工具方法 walkFileTree 来高效并优雅地遍历文件系统

    3) walkFileTree:

         i. 表示从start代表的节点开始遍历文件系统;

         ii. 其中visitor是遍历过程中的行为控制器;

public class FileUtils {

    private FileUtils() {
} public static void copyFolder(Path source,Path target) throws IOException { Files.walkFileTree(source, new SimpleFileVisitor<Path>() { private Path current; /**
* 接口方法的返回值 FileVisitResult 是一个枚举类型,
* walkFileTree 会根据这个返回值决定是否要继续遍历下去,
* 如果要继续遍历,它总共有4个枚举值:都是 FileVisitResult 中定义的枚举值
*
* CONTINUE:继续遍历
*
* SKIP_SIBLINGS:继续遍历,但忽略当前节点的所有兄弟节点直接返回上一层继续遍历
*
* SKIP_SUBTREE:继续遍历,但是忽略子目录,但是子文件还是会访问
*
* TERMINATE:终止遍历
*/ //访问一个目录前(dir:正在访问的绝对路径目录)
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
//截取相对路径( source.relativize(dir) ),拼接到目标目录( target.resolve(dir) )
current = target.resolve(source.relativize(dir).toString());
//创建目标文件夹,并继续
Files.createDirectories(current);
return FileVisitResult.CONTINUE;
} //正在访问一个文件时(file:正在访问的绝对路径文件)
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//复制文件
Files.copy(file, target.resolve(source.relativize(file).toString()), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
});
}
}

递归删除文件夹

    public static void deleteFolder(Path deletingPath) throws IOException {

        if (Files.notExists(deletingPath)) {
return;
} org.eclipse.jgit.util.FileUtils.delete(deletingPath.toFile(),
org.eclipse.jgit.util.FileUtils.RECURSIVE | org.eclipse.jgit.util.FileUtils.RETRY);
}

FileUtils

创建临时目录:

    public static Path createTempDirectory() throws IOException {
//创建前缀为"halo"的临时目录
return Files.createTempDirectory("halo");
} 检查给定路径是否为空: public static boolean isEmpty(Path path) throws IOException { //不是目录或者不存在,返回true
if (!Files.isDirectory(path) || Files.notExists(path)) {
return true;
} /**
* Files.list(path)
* 返回的元素是一个惰性填充的流(非递归)
* 流的元素是Path对象
*/
try (Stream<Path> pathStream = Files.list(path)) {
//判断是否是空目录
return pathStream.count() == 0;
}
} 将ZipInputStream解压缩到目标路径: public static void unzip(ZipInputStream zis, Path targetPath) throws IOException { //创建目标路径(如果路径不存在)
if (Files.notExists(targetPath)) {
Files.createDirectories(targetPath);
} //目标路径必须为空
mustBeEmpty(targetPath); ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) {
//合并路径
Path entryPath = targetPath.resolve(zipEntry.getName()); //检查目录(判断entryPath是否以targetPath开头)
FileUtils.checkDirectoryTraversal(targetPath, entryPath); if (zipEntry.isDirectory()) {
//创建目录
Files.createDirectories(entryPath);
} else {
//复制文件
Files.copy(zis, entryPath);
}
zipEntry = zis.getNextEntry();
}
}

Halo(五)的更多相关文章

  1. Halo 开源项目学习(五):评论与点赞

    基本介绍 博客系统中,用户浏览文章时可以在文章下方发表自己的观点,与博主或其他用户进行互动,也可以为喜欢的文章点赞.下面我们一起分析一下 Halo 项目中评论和点赞功能的实现过程. 发表评论 评论可以 ...

  2. 使用Docker快速搭建Halo个人博客到阿里云服务器上[附加主题和使用域名访问]

    一.前言 小编买了一个服务器也是一直想整个网站,一直在摸索,看了能够快速搭建博客系统的教程.总结了有以下几种方式,大家按照自己喜欢的去搭建: halo wordpress hexo vuepress ...

  3. 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...

  4. 旺财速啃H5框架之Bootstrap(五)

    在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...

  5. 移动站应该尝试百度MIP的五个原因

    MIP是什么?MIP是百度在2016年提出的移动网页加速器项目. MIP能做什么?MIP能帮助站长和网站开发者快速搭建移动端页面. MIP怎么加速?MIP从前端渲染和页面网络传输两方面进行优化,杜绝页 ...

  6. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  7. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  8. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  9. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

随机推荐

  1. Spring Transaction Propagation

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11530611.html REQUIRED behavior Spring REQUIRED behav ...

  2. kali网络源配置

    使用vim对sources.list文件进行修改: $   vim /etc/apt/sources.list 随便挑选一个源添加到该文件中 ----------------------------- ...

  3. Delphi Treeview 用法(概念、属性、添加编辑插入节点、定位节点、拖拽等)

    今天再细研究了一下Treeview的用法,网上虽然总结了很多,但是还是有很多节点没有讲到了,也给使用中遇到很多问题.特地总结一下: 1.概念 Treeview用于显示按照树形结构进行组织的数据.Tre ...

  4. Delphi 运行后错误提示“无效的授权说明”

    Delphi 运行后错误提示“无效的授权说明” 一般情况是:数据库的连接出现了问题. 解决方法:检查加载数据库是否正常,能否正常连接.

  5. springboot 加载jsp 刷新jsp ,刷新Controller (亲自尝试)

    解决jsp加载成功.<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId&g ...

  6. python学习笔记(二)列表操作

    列表及列表操作: 列表是最常用的数据类型之一,列表也叫数组,列表定义,使用[]即可:列表里面可以再套列表,一个里面套一个列表,叫二维数组:一个里面套一个列表,里面的列表再套一个列表,这个叫三位数组,套 ...

  7. JS中数据结构之字典

    字典是一种以键 - 值对形式存储数据的数据结构 通过数组实现字典 function Dictionary() { this.add = add; this.datastore = new Array( ...

  8. delphi中如何将一整个文件读入内存

    来源 https://bbs.csdn.net/topics/390985048 分配一块大内存吧,要是一下申请不了64M那么大,就多申请几块小的,用个链表连起来.用FileStream类的方法读取文 ...

  9. 2019 牛客暑期多校 第二场 H Second Large Rectangle (单调栈)

    题目:https://ac.nowcoder.com/acm/contest/882/H 题意:一个大的01矩阵,然后现在要求第二大的全一矩阵是多少 思路:在这里我们首先学习一下另一个东西,怎么求直方 ...

  10. PHP远程DoS漏洞深入分析及防护方案

    PHP远程DoS漏洞 4月3日,有人在PHP官网提交PHP 远程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代号69364.由于该漏 ...