02HuTool-IO流V1.0.2
2021-08-23 12:46:56 0 举报
AI智能生成
文件相关方法与属性
作者其他创作
大纲/内容
IO工具类-IoUtil
由来
IO工具类的存在主要针对InputStream、OutputStream、Reader、Writer封装简化,并对NIO相关操作做封装简化。总体来说,Hutool对IO的封装,主要是工具层面,我们努力做到在便捷、性能和灵活之间找到最好的平衡点。
方法
拷贝
流的读写可以总结为从输入流读取,从输出流写出,这个过程我们定义为拷贝。这个是一个基本过程,也是文件、流操作的基础
BufferedInputStream in = FileUtil.getInputStream("d:/test.txt");
BufferedOutputStream out = FileUtil.getOutputStream("d:/test2.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
BufferedOutputStream out = FileUtil.getOutputStream("d:/test2.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
copy方法同样针对Reader、Writer、Channel等对象有一些重载方法,并提供可选的缓存大小。默认的,缓存大小为1024个字节,如果拷贝大文件或流数据较大,可以适当调整这个参数。
针对NIO,提供了copyByNIO方法,以便和BIO有所区别。我查阅过一些资料,使用NIO对文件流的操作有一定的提升,我并没有做具体实验
针对NIO,提供了copyByNIO方法,以便和BIO有所区别。我查阅过一些资料,使用NIO对文件流的操作有一定的提升,我并没有做具体实验
Stream转Reader、Writer
1、IoUtil.getReader:将InputStream转为BufferedReader用于读取字符流,它是部分readXXX方法的基础。
2、IoUtil.getWriter:将OutputStream转为OutputStreamWriter用于写入字符流,它是部分writeXXX的基础。
2、IoUtil.getWriter:将OutputStream转为OutputStreamWriter用于写入字符流,它是部分writeXXX的基础。
读取流中的内容
1、读取流中的内容总结下来,可以分为read方法和readXXX方法
1、read方法有诸多的重载方法,根据参数不同,可以读取不同对象中的内容,这包括:
InputStream
Reader
FileChannel
这三个重载大部分返回String字符串,为字符流读取提供极大便利
Reader
FileChannel
这三个重载大部分返回String字符串,为字符流读取提供极大便利
2、readXXX方法主要针对返回值做一些处理,例如:
readBytes 返回byte数组(读取图片等)
readHex 读取16进制字符串
readObj 读取序列化对象(反序列化)
readLines 按行读取
readHex 读取16进制字符串
readObj 读取序列化对象(反序列化)
readLines 按行读取
3、toStream方法则是将某些对象转换为流对象,便于在某些情况下操作:
String 转换为ByteArrayInputStream
File 转换为FileInputStream
File 转换为FileInputStream
写入到流
IoUtil.write方法有两个重载方法,一个直接调用OutputStream.write方法,另一个用于将对象转换为字符串(调用toString方法),然后写入到流中。
IoUtil.writeObjects 用于将可序列化对象序列化后写入到流中
write方法并没有提供writeXXX,需要自己转换为String或byte[]
关闭
对于IO操作来说,使用频率最高(也是最容易被遗忘)的就是close操作,好在Java规范使用了优雅的Closeable接口,这样我们只需简单封装调用此接口的方法即可。
关闭操作会面临两个问题:
关闭操作会面临两个问题:
1、被关闭对象为空
2、对象关闭失败(或对象已关闭)
2、对象关闭失败(或对象已关闭)
在JDK1.7中,提供了AutoCloseable接口,在IoUtil中同样提供相应的重载方法,在使用中并不能感觉到有哪些不同
文件类型判断-FileTypeUtil
由来
在文件上传时,有时候我们需要判断文件类型。但是又不能简单的通过扩展名来判断(防止恶意脚本等通过上传到服务器上),于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型。
使用
这个工具类使用非常简单,通过调用FileTypeUtil.getType即可判断,这个方法同时提供众多的重载方法,用于读取不同的文件和流
File file = FileUtil.file("d:/test.jpg");
String type = FileTypeUtil.getType(file);
//输出 jpg则说明确实为jpg文件
Console.log(type);
String type = FileTypeUtil.getType(file);
//输出 jpg则说明确实为jpg文件
Console.log(type);
原理和局限性
这个类是通过读取文件流中前N个byte值来判断文件类型,在类中我们通过Map形式将常用的文件类型做了映射,这些映射都是网络上搜集而来。也就是说,我们只能识别有限的几种文件类型。但是这些类型已经涵盖了常用的图片、音频、视频、Office文档类型,可以应对大部分的使用场景
自定义类型
为了提高FileTypeUtil的扩展性,我们通过putFileType方法可以自定义文件类型
FileTypeUtil.putFileType("ffd8ffe000104a464946", "new_jpg");
第一个参数是文件流的前N个byte的16进制表示,我们可以读取自定义文件查看,选取一定长度即可(长度越长越精确),第二个参数就是文件类型,然后使用FileTypeUtil.getType即可
概述
由来
IO的操作包括读和写,应用场景包括网络操作和文件操作。IO操作在Java中是一个较为复杂的过程,我们在面对不同的场景时,要选择不同的InputStream和OutputStream实现来完成这些操作。而如果想读写字节流,还需要Reader和Writer的各种实现类。这些繁杂的实现类,一方面给我我们提供了更多的灵活性,另一方面也增加了复杂性。
封装
io包的封装主要针对流、文件的读写封装,主要以工具类为主,提供常用功能的封装,这包括:
IoUtil 流操作工具类
FileUtil 文件读写和操作的工具类。
FileTypeUtil 文件类型判断工具类
WatchMonitor 目录、文件监听,封装了JDK1.7中的WatchService
ClassPathResource针对ClassPath中资源的访问封装
FileReader 封装文件读取
FileWriter 封装文件写入
FileUtil 文件读写和操作的工具类。
FileTypeUtil 文件类型判断工具类
WatchMonitor 目录、文件监听,封装了JDK1.7中的WatchService
ClassPathResource针对ClassPath中资源的访问封装
FileReader 封装文件读取
FileWriter 封装文件写入
流扩展
除了针对JDK的读写封装外,还针对特定环境和文件扩展了流实现。包括以下:
1、BOMInputStream针对含有BOM头的流读取
2、FastByteArrayOutputStream 基于快速缓冲FastByteBuffer的OutputStream,随着数据的增长自动扩充缓冲区(from blade)
3、FastByteBuffer 快速缓冲,将数据存放在缓冲集中,取代以往的单一数组(from blade)
2、FastByteArrayOutputStream 基于快速缓冲FastByteBuffer的OutputStream,随着数据的增长自动扩充缓冲区(from blade)
3、FastByteBuffer 快速缓冲,将数据存放在缓冲集中,取代以往的单一数组(from blade)
文件工具类-FileUtil
说明
在IO操作中,文件的操作相对来说是比较复杂的,但也是使用频率最高的部分,我们几乎所有的项目中几乎都躺着一个叫做FileUtil或者FileUtils的工具类,我想Hutool应该将这个工具类纳入其中,解决用来解决大部分的文件操作问题。
总体来说,FileUtil类包含以下几类操作工具
1、文件操作:包括文件目录的新建、删除、复制、移动、改名等
2、文件判断:判断文件或目录是否非空,是否为目录,是否为文件等等。
3、绝对路径:针对ClassPath中的文件转换为绝对路径文件。
4、文件名:主文件名,扩展名的获取
5、读操作:包括类似IoUtil中的getReader、readXXX操作
6、写操作:包括getWriter和writeXXX操作
在FileUtil中,我努力将方法名与Linux相一致,例如创建文件的方法并不是createFile,而是touch,这种统一对于熟悉Linux的人来说,大大提高了上手速度。当然,如果你不熟悉Linux,那FileUtil工具类的使用则是在帮助你学习Linux命令。这些类Linux命令的方法包括:
1、ls 列出目录和文件
2、touch 创建文件,如果父目录不存在也自动创建
3、mkdir 创建目录,会递归创建每层目录
4、del 删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令
5、copy 拷贝文件或目录
注意:
1、这些方法提供了人性化的操作,例如touch方法,在创建文件的情况下会自动创建上层目录(我想对于使用者来说这也是大部分情况下的需求),同样mkdir也会创建父目录
2、del方法会删除目录而不判断其是否为空,这一方面方便了使用,另一方面也可能造成一些预想不到的后果(比如拼写错路径而删除不应该删除的目录),所以请谨慎使用此方法。
1、这些方法提供了人性化的操作,例如touch方法,在创建文件的情况下会自动创建上层目录(我想对于使用者来说这也是大部分情况下的需求),同样mkdir也会创建父目录
2、del方法会删除目录而不判断其是否为空,这一方面方便了使用,另一方面也可能造成一些预想不到的后果(比如拼写错路径而删除不应该删除的目录),所以请谨慎使用此方法。
文件监听-WatchMonitor
0 条评论
下一页