今日分享 每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您。 架构开源地址:https:gitee。commsxy 评论转发Hutool概述 IO的操作包括读和写,应用场景包括网络操作和文件操作。IO操作在Java中是一个较为复杂的过程,我们在面对不同的场景时,要选择不同的InputStream和OutputStream实现来完成这些操作。而如果想读写字节流,还需要Reader和Writer的各种实现类。这些繁杂的实现类,一方面给我我们提供了更多的灵活性,另一方面也增加了复杂性。IO封装 io包的封装主要针对流、文件的读写封装,主要以工具类为主,提供常用功能的封装,这包括:IoUtil流操作工具类FileUtil文件读写和操作的工具类。FileTypeUtil文件类型判断工具类WatchMonitor目录、文件监听,封装了JDK1。7中的WatchServiceClassPathResource针对ClassPath中资源的访问封装FileReader封装文件读取FileWriter封装文件写入IO工具类IoUtil 流的读写可以总结为从输入流读取,从输出流写出,这个过程我们定义为拷贝。这个是一个基本过程,也是文件、流操作的基础。文档拷贝Testpublicvoidcopy(){BufferedInputStreaminFileUtil。getInputStream(D:hometest。txt);BufferedOutputStreamoutFileUtil。getOutputStream(D:hometest2。txt);longcopySizeIoUtil。copy(in,out,IoUtil。DEFAULTBUFFERSIZE);}文件工具类FileUtills列出目录和文件touch创建文件,如果父目录不存在也自动创建mkdir创建目录,会递归创建每层目录del删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令copy拷贝文件或目录这些方法提供了人性化的操作,例如touch方法,在创建文件的情况下会自动创建上层目录 列出目录和文件列出目录和文件Testpublicvoidls(){File〔〕filesFileUtil。ls(D:home);for(Filef:files){System。out。println(f。getName());}} 创建文件创建文件,如果父目录不存在也自动创建Testpublicvoidtouch(){FilefileFileUtil。touch(D:homeqingfeng。txt);System。out。println(file。getName());} 创建目录创建目录,会递归创建每层目录Testpublicvoidmkdir(){FilefileFileUtil。mkdir(D:homeqingfengdata);System。out。println(file。getName());} 删除文件或目录删除文件或目录(递归删除,不判断是否为空),这个方法相当于Linux的delete命令Testpublicvoiddel(){booleanbolFileUtil。del(D:homeqingfengdata);System。out。println(bol);} FileUtil拷贝文件拷贝TestpublicvoidcopyFile(){FilepathFileUtil。copy(newFile(D:homeqingfeng。txt),newFile(D:homeqingfeng123。txt),true);System。out。println(path);}文件类型判断FileTypeUtil 在文件上传时,有时候我们需要判断文件类型。但是又不能简单的通过扩展名来判断(防止恶意脚本等通过上传到服务器上),于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型。获取文件类型TestpublicvoidgetFileType(){FilefileFileUtil。file(D:homeqingfeng。txt);StringtypeFileTypeUtil。getType(file);System。out。println(type);}文件读取FileReader FileReader提供了以下方法来快速读取文件内容:readBytesreadStringreadLines同时,此类还提供了以下方法用于转换为流或者BufferedReader:getReadergetInputStream文件读取FileReaderTestpublicvoidFileReader(){默认UTF8编码,可以在构造中传入第二个参数做为编码FileReaderfileReadernewFileReader(D:homeqingfeng。txt);StringresultfileReader。readString();System。out。println(result);byte〔〕readBytesfileReader。readBytes();for(Bytestr:readBytes){System。out。println(str);}ListStringreadLinesfileReader。readLines();for(Stringstr:readLines){System。out。println(str);}}文件写入FileWriter 此类提供了:getOutputStreamgetWritergetPrintWriter这些方法用于转换为相应的类提供更加灵活的写入操作。文件写入FileWriterTestpublicvoidFileWriter(){FileWriterwriternewFileWriter(D:homeqingfeng。txt);writer。write(test);writer。append(123);}文件监听WatchMonitor 在Hutool中,WatchMonitor主要针对JDK7中WatchService做了封装,针对文件和目录的变动(创建、更新、删除)做一个钩子,在Watcher中定义相应的逻辑来应对这些文件的变化。 WatchMonitor提供的事件有:ENTRYMODIFY文件修改的事件ENTRYCREATE文件或目录创建的事件ENTRYDELETE文件或目录删除的事件OVERFLOW丢失的事件这些事件对应StandardWatchEventKinds中的事件。文件监控WatchMonitorpublicstaticvoidmain(String〔〕args){FilefileFileUtil。file(D:homeqingfeng。txt);这里只监听文件或目录的修改事件WatchMonitorwatchMonitorWatchMonitor。create(file,WatchMonitor。ENTRYMODIFY);watchMonitor。setWatcher(newWatcher(){OverridepublicvoidonCreate(WatchE?event,PathcurrentPath){Objectobjevent。context();System。out。println(创建:currentPathobj);}OverridepublicvoidonModify(WatchE?event,PathcurrentPath){Objectobjevent。context();System。out。println(修改:currentPathobj);}OverridepublicvoidonDelete(WatchE?event,PathcurrentPath){Objectobjevent。context();System。out。println(删除:currentPathobj);}OverridepublicvoidonOverflow(WatchE?event,PathcurrentPath){Objectobjevent。context();System。out。println(Overflow:currentPathobj);}});设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录watchMonitor。setMaxDepth(3);启动监听watchMonitor。start();}ClassPath资源访问 在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的srcmainresources下,读取的时候使用:读取配置的资源文件throwsIOExceptionTestpublicvoidClassPathResource()throwsIOException{ClassPathResourceresourcenewClassPathResource(test。properties);PropertiespropertiesnewProperties();properties。load(resource。getStream());System。out。println(properties);}