网站首页 > 博客文章 正文
今日分享
每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您。
架构开源地址:https://gitee.com/msxy
评论转发
Hutool概述
IO的操作包括读和写,应用场景包括网络操作和文件操作。IO操作在Java中是一个较为复杂的过程,我们在面对不同的场景时,要选择不同的InputStream和OutputStream实现来完成这些操作。而如果想读写字节流,还需要Reader和Writer的各种实现类。这些繁杂的实现类,一方面给我我们提供了更多的灵活性,另一方面也增加了复杂性。
IO封装
io包的封装主要针对流、文件的读写封装,主要以工具类为主,提供常用功能的封装,这包括:
- IoUtil 流操作工具类
- FileUtil 文件读写和操作的工具类。
- FileTypeUtil 文件类型判断工具类
- WatchMonitor 目录、文件监听,封装了JDK1.7中的WatchService
- ClassPathResource针对ClassPath中资源的访问封装
- FileReader 封装文件读取
- FileWriter 封装文件写入
IO工具类-IoUtil
流的读写可以总结为从输入流读取,从输出流写出,这个过程我们定义为拷贝。这个是一个基本过程,也是文件、流操作的基础。
/**
* 文档拷贝
*/
@Test
public void copy(){
BufferedInputStream in = FileUtil.getInputStream("D:\\home\\test.txt");
BufferedOutputStream out = FileUtil.getOutputStream("D:\\home\\test2.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
}
文件工具类-FileUtil
- ls 列出目录和文件
- touch 创建文件,如果父目录不存在也自动创建
- mkdir 创建目录,会递归创建每层目录
- del 删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令
- copy 拷贝文件或目录这些方法提供了人性化的操作,例如touch方法,在创建文件的情况下会自动创建上层目录
列出目录和文件
/**
* 列出目录和文件
*/
@Test
public void ls(){
File[] files = FileUtil.ls("D:\\home");
for (File f:files) {
System.out.println(f.getName());
}
}
创建文件
/**
* 创建文件,如果父目录不存在也自动创建
*/
@Test
public void touch(){
File file = FileUtil.touch("D:\\home\\qingfeng.txt");
System.out.println(file.getName());
}
创建目录
/**
* 创建目录,会递归创建每层目录
*/
@Test
public void mkdir(){
File file = FileUtil.mkdir("D:\\home\\qingfeng\\data");
System.out.println(file.getName());
}
删除文件或目录
/**
* 删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令
*/
@Test
public void del(){
boolean bol = FileUtil.del("D:\\home\\qingfeng\\data");
System.out.println(bol);
}
FileUtil拷贝
/**
* 文件拷贝
*/
@Test
public void copyFile(){
File path = FileUtil.copy(new File("D:\\home\\qingfeng.txt"),new File("D:\\home\\qingfeng123.txt"),true);
System.out.println(path);
}
文件类型判断-FileTypeUtil
在文件上传时,有时候我们需要判断文件类型。但是又不能简单的通过扩展名来判断(防止恶意脚本等通过上传到服务器上),于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型。
/**
* 获取文件类型
*/
@Test
public void getFileType(){
File file = FileUtil.file("D:\\home\\qingfeng.txt");
String type = FileTypeUtil.getType(file);
System.out.println(type);
}
文件读取-FileReader
FileReader提供了以下方法来快速读取文件内容:
- readBytes
- readString
- readLines同时,此类还提供了以下方法用于转换为流或者BufferedReader:
- getReader
- getInputStream
/**
* 文件读取-FileReader
*/
@Test
public void FileReader(){
//默认UTF-8编码,可以在构造中传入第二个参数做为编码
FileReader fileReader = new FileReader("D:\\home\\qingfeng.txt");
String result = fileReader.readString();
System.out.println(result);
// byte[] readBytes = fileReader.readBytes();
// for (Byte str:readBytes) {
// System.out.println(str);
// }
List<String> readLines = fileReader.readLines();
for (String str:readLines) {
System.out.println(str);
}
}
文件写入-FileWriter
此类提供了:
- getOutputStream
- getWriter
- getPrintWriter这些方法用于转换为相应的类提供更加灵活的写入操作。
/**
* 文件写入-FileWriter
*/
@Test
public void FileWriter(){
FileWriter writer = new FileWriter("D:\\home\\qingfeng.txt");
writer.write("test");
writer.append("123");
}
文件监听-WatchMonitor
在Hutool中,WatchMonitor主要针对JDK7中WatchService做了封装,针对文件和目录的变动(创建、更新、删除)做一个钩子,在Watcher中定义相应的逻辑来应对这些文件的变化。
WatchMonitor提供的事件有:
- ENTRY_MODIFY 文件修改的事件
- ENTRY_CREATE 文件或目录创建的事件
- ENTRY_DELETE 文件或目录删除的事件
- OVERFLOW 丢失的事件这些事件对应StandardWatchEventKinds中的事件。
/**
* 文件监控-WatchMonitor
*/
public static void main(String[] args) {
File file = FileUtil.file("D:\\home\\qingfeng.txt");
//这里只监听文件或目录的修改事件
WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.ENTRY_MODIFY);
watchMonitor.setWatcher(new Watcher(){
@Override
public void onCreate(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
System.out.println("创建:"+currentPath+"-> "+obj);
}
@Override
public void onModify(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
System.out.println("修改:"+currentPath+"-> "+obj);
}
@Override
public void onDelete(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
System.out.println("删除:"+currentPath+"-> "+obj);
}
@Override
public void onOverflow(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
System.out.println("Overflow:"+currentPath+"-> "+obj);
}
});
//设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录
watchMonitor.setMaxDepth(3);
//启动监听
watchMonitor.start();
}
ClassPath资源访问
在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,读取的时候使用:
/**
* 读取配置的资源文件
* @throws IOException
*/
@Test
public void ClassPathResource() throws IOException {
ClassPathResource resource = new ClassPathResource("test.properties");
Properties properties = new Properties();
properties.load(resource.getStream());
System.out.println(properties);
}
- 上一篇: Hutool:Java工具包简介与使用指南
- 下一篇: java组件HuTool相关工具类的使用(七)
猜你喜欢
- 2024-11-12 基于SpringBoot 的CMS系统,拿去开发企业官网真香(附源码)
- 2024-11-12 解决JAVA压缩图片变色问题(java压缩图片至指定大小)
- 2024-11-12 J2eeFAST 开源平台(j2ee开发工具)
- 2024-11-12 Java项目中用它来代替一半的反射使用,爽到飞起!
- 2024-11-12 反射用不好真的会影响代码执行效率!
- 2024-11-12 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类
- 2024-11-12 Java面试问题(一)—— java 基础(java面试问题大全及答案大全)
- 2024-11-12 一个轻量级的Java快速开发平台快速开发项目并交付「接私活利器」
- 2024-11-12 电商系统中的 ID 是如何生成的?(电商注册账号是什么)
- 2024-11-12 用了这两款插件,同事再也不说我代码写的烂了
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)