hutool 文件操作相关的类

hutool 文件操作相关的类

介绍

Hutool 里的文件相关工具:

IOUtil :操作流的

FileUtil :操作文件的

FileTypeUtil: 被包含在FileUtil里了

FileReader,FileWriter:这两个基本上都在FileUtil里用了

WatchMonitor: 用来监控文件变化,可以看看自己c盘,平时文件都有什么变化。

ClassPathResource 是class 路径下资源的获取

IOUtil

拷贝

在这里插入图片描述

把输入流的数据复制到输出流中

long copy(InputStream in, OutputStream out)

Stream转Reader、Writer

IoUtil.getReader:将InputStream转为BufferedReader用于读取字符流,它是部分readXXX方法的基础。
IoUtil.getWriter:将OutputStream转为OutputStreamWriter用于写入字符流,它是部分writeXXX的基础。

读取流中的内容

读取输入流的内容为字符串

String read(InputStream in, String charsetName)
读取流中的内容总结下来,可以分为read方法和readXXX方法。

read方法有诸多的重载方法,根据参数不同,可以读取不同对象中的内容,这包括:
InputStream
Reader
FileChannel
这三个重载大部分返回String字符串,为字符流读取提供极大便利。

readXXX方法主要针对返回值做一些处理,例如:
readBytes 返回byte数组(读取图片等)
readHex 读取16进制字符串
readObj 读取序列化对象(反序列化)
readLines 按行读取
toStream方法则是将某些对象转换为流对象,便于在某些情况下操作:
String 转换为ByteArrayInputStream
File 转换为FileInputStream

写入到流

把数据写出到输出流中

void writeUtf8(OutputStream out, boolean isCloseOut, Object… contents)

IoUtil.write方法有两个重载方法,一个直接调用OutputStream.write方法,另一个用于将对象转换为字符串(调用toString方法),然后写入到流中。
IoUtil.writeObjects 用于将可序列化对象序列化后写入到流中。
write方法并没有提供writeXXX,需要自己转换为String或byte[]。

关闭

对于IO操作来说,使用频率最高(也是最容易被遗忘)的就是close操作,好在Java规范使用了优雅的Closeable接口,这样我们只需简单封装调用此接口的方法即可。

关闭操作会面临两个问题:

被关闭对象为空
对象关闭失败(或对象已关闭)
IoUtil.close方法很好的解决了这两个问题。

FileUtil

是否是windows系统 (通过分隔符进行判断)

boolean isWindows

追加数据

File appendString(String content, File file, String charset)

遍历当前目录及其子目录

List loopFiles(String path)

目录及其子目录所有文件的大小总和

long size(File file)

创建文件,会自动创建父文件夹。 方法名故意用linux下的命令名

File touch(String fullFilePath)

删除文件或者目录(这个很危险,会自动删除当前目录以及子目录,慎用)

boolean del(String fullFileOrDirPath)

同上

static boolean clean(String dirPath)

复制文件或者目录

File copyFile(String src, String dest, StandardCopyOption… options)

判断俩文件内容是否一样

boolean contentEquals(File file1, File file2)

获取后缀名,不带.

String extName(String fileName)

根据文件头部信息获取文件类型

String getType(File file)

读取内容为字符串

readString(String path, String charsetName)

读取内容为集合

List readLines(String path, String charset)

把字符串写入到文件

File writeString(String content, String path, String charset)

把集合写入到文件

File writeLines(Collection list, File file, String charset)

转换文件编码,第一个参数必须和文件本身编码保持一致,否则就会出错。比如一个文件是GBK的,但是在UTF默认编码的环境下看到都是乱码,就可以通过这个转换一下

File convertCharset(File file, Charset srcCharset, Charset destCharset)

指定换行符,有些文件从Linux搞来的,在window下换行会混乱,可以用这个进行转换

convertLineSeparator(File file, Charset charset, LineSeparator lineSeparator)

获取CRC32校验码

long checksumCRC32(File file)

获取Web项目下的web root路径

File getWebRoot()

根据文件后缀名 (不一定是真实格式),获取其mimetype

String getMimeType(String filePath)

WatchMonitor

File file = FileUtil.file("D:\\image\\testSave\\2025-3-4\\camera0");
        //这里只监听文件或目录的修改事件
        WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.EVENTS_ALL);
        watchMonitor.setWatcher(new Watcher(){
            @Override
            public void onCreate(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                log.info("创建:{}-> {}", currentPath, obj);
            }

            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                //Object obj = event.context();
                //log.info("修改:{}-> {}", currentPath, obj);
            }

            @Override
            public void onDelete(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                log.info("删除:{}-> {}", currentPath, obj);
            }

            @Override
            public void onOverflow(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                log.info("Overflow:{}-> {}", currentPath, obj);
            }
        });

        //设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录
        watchMonitor.setMaxDepth(Integer.MAX_VALUE);
        //启动监听
        watchMonitor.start();

// 延迟处理监听事件
//在监听目录或文件时,如果这个文件有修改操作,JDK会多次触发modify方法,为了解决这个问题,
// 我们定义了DelayWatcher,
// 此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发,从而避免以上问题。
WatchMonitor monitor = WatchMonitor.createAll(“D:\image\testSave\2025-3-4\camera0”, new DelayWatcher(new SimpleWatcher(){
@Override
public void onModify(WatchEvent<?> event, Path currentPath) {
log.info(“EVENT modify”);
}
}, 500));
monitor.start();

ClassPathResource

在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,读取的时候使用:

String path = “config.properties”;
InputStream in = this.class.getResource(path).openStream();
使用当前类来获得资源其实就是使用当前类的类加载器获取资源,最后openStream()方法获取输入流来读取文件流。

封装
面对这种复杂的读取操作,我们封装了ClassPathResource类来简化这种资源的读取:

ClassPathResource resource = new ClassPathResource(“test.properties”);
Properties properties = new Properties();
properties.load(resource.getStream());

Console.log(“Properties: {}”, properties);
这样就大大简化了ClassPath中资源的读取。

Hutool提供针对properties的封装类Props,同时提供更加强大的配置文件Setting类,这两个类已经针对ClassPath做过相应封装,可以以更加便捷的方式读取配置文件。

文件类型判断

  File file = FileUtil.file("D:。。。。。");
    String type = FileTypeUtil.getType(file);
    //输出的是文件的格式
    log.info(type);

监控”文件的变化,类似于Linux下的tail -f命令

Tailer tailer = new Tailer(FileUtil.file("d:/桌面/test.log"), Tailer.CONSOLE_HANDLER, 2);
tailer.start();

/**
 * 命令行打印的行处理器
 * 

 */
public static class ConsoleLineHandler implements LineHandler {
    @Override
    public void handle(String line) {
        Console.log(line);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值