当前位置:首页 > 芯闻号 > 充电吧
[导读]Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍: 1) 工具类 2) 输入

Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:
1) 工具类
2) 输入
3) 输出
4) filters过滤
5) Comparators
6) 文件监控
总的入口例子为:

Java代码publicclassApacheCommonsExampleMain{ publicstaticvoidmain(String[]args){ UtilityExample.runExample(); FileMonitorExample.runExample(); FiltersExample.runExample(); InputExample.runExample(); OutputExample.runExample(); ComparatorExample.runExample(); } }
一 工具类包UtilityExample代码:
这个工具类包分如下几个主要工具类:
1) FilenameUtils:主要处理各种操作系统下对文件名的操作
2) FileUtils:处理文件的打开,移动,读取和判断文件是否存在
3) IOCASE:字符串的比较
4) FileSystemUtils:返回磁盘的空间大小
Java代码importjava.io.File; importjava.io.IOException; importorg.apache.commons.io.FileSystemUtils; importorg.apache.commons.io.FileUtils; importorg.apache.commons.io.FilenameUtils; importorg.apache.commons.io.LineIterator; importorg.apache.commons.io.IOCase; publicfinalclassUtilityExample{ //WeareusingthefileexampleTxt.txtinthefolderExampleFolder, //andweneedtoprovidethefullpathtotheUtilityclasses. privatestaticfinalStringEXAMPLE_TXT_PATH= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleTxt.txt"; privatestaticfinalStringPARENT_DIR= "C:\Users\Lilykos\workspace\ApacheCommonsExample"; publicstaticvoidrunExample()throwsIOException{ System.out.println("UtilityClassesexample..."); //FilenameUtils System.out.println("FullpathofexampleTxt:"+ FilenameUtils.getFullPath(EXAMPLE_TXT_PATH)); System.out.println("FullnameofexampleTxt:"+ FilenameUtils.getName(EXAMPLE_TXT_PATH)); System.out.println("ExtensionofexampleTxt:"+ FilenameUtils.getExtension(EXAMPLE_TXT_PATH)); System.out.println("BasenameofexampleTxt:"+ FilenameUtils.getBaseName(EXAMPLE_TXT_PATH)); //FileUtils //WecancreateanewFileobjectusingFileUtils.getFile(String) //andthenusethisobjecttogetinformationfromthefile. FileexampleFile=FileUtils.getFile(EXAMPLE_TXT_PATH); LineIteratoriter=FileUtils.lineIterator(exampleFile); System.out.println("ContentsofexampleTxt..."); while(iter.hasNext()){ System.out.println("t"+iter.next()); } iter.close(); //Wecancheckifafileexistssomewhereinsideacertaindirectory. Fileparent=FileUtils.getFile(PARENT_DIR); System.out.println("ParentdirectorycontainsexampleTxtfile:"+ FileUtils.directoryContains(parent,exampleFile)); //IOCase Stringstr1="ThisisanewString."; Stringstr2="ThisisanothernewString,yes!"; System.out.println("Endswithstring(casesensitive):"+ IOCase.SENSITIVE.checkEndsWith(str1,"string.")); System.out.println("Endswithstring(caseinsensitive):"+ IOCase.INSENSITIVE.checkEndsWith(str1,"string.")); System.out.println("Stringequality:"+ IOCase.SENSITIVE.checkEquals(str1,str2)); //FileSystemUtils System.out.println("Freediskspace(inKB):"+FileSystemUtils.freeSpaceKb("C:")); System.out.println("Freediskspace(inMB):"+FileSystemUtils.freeSpaceKb("C:")/1024); } }


输出:
Java代码UtilityClassesexample... FullpathofexampleTxt:C:UsersLilykosworkspaceApacheCommonsExampleExampleFolder FullnameofexampleTxt:exampleTxt.txt ExtensionofexampleTxt:txt BasenameofexampleTxt:exampleTxt ContentsofexampleTxt... Thisisanexampletextfile. WewilluseitforexperimentingwithApacheCommonsIO. ParentdirectorycontainsexampleTxtfile:true Endswithstring(casesensitive):false Endswithstring(caseinsensitive):true Stringequality:false Freediskspace(inKB):32149292 Freediskspace(inMB):31395


二 FileMonitor工具类包
这个org.apache.commons.io.monitor 包中的工具类可以监视文件或者目录的变化,获得指定文件或者目录的相关信息,下面看例子:
Java代码importjava.io.File; importjava.io.IOException; importorg.apache.commons.io.FileDeleteStrategy; importorg.apache.commons.io.FileUtils; importorg.apache.commons.io.monitor.FileAlterationListenerAdaptor; importorg.apache.commons.io.monitor.FileAlterationMonitor; importorg.apache.commons.io.monitor.FileAlterationObserver; importorg.apache.commons.io.monitor.FileEntry; publicfinalclassFileMonitorExample{ privatestaticfinalStringEXAMPLE_PATH= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleFileEntry.txt"; privatestaticfinalStringPARENT_DIR= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder"; privatestaticfinalStringNEW_DIR= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\newDir"; privatestaticfinalStringNEW_FILE= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\newFile.txt"; publicstaticvoidrunExample(){ System.out.println("FileMonitorexample..."); //FileEntry //Wecanmonitorchangesandgetinformationaboutfiles //usingthemethodsofthisclass. FileEntryentry=newFileEntry(FileUtils.getFile(EXAMPLE_PATH)); System.out.println("Filemonitored:"+entry.getFile()); System.out.println("Filename:"+entry.getName()); System.out.println("Isthefileadirectory?:"+entry.isDirectory()); //FileMonitoring //Createanewobserverforthefolderandaddalistener //thatwillhandletheeventsinaspecificdirectoryandtakeaction. FileparentDir=FileUtils.getFile(PARENT_DIR); FileAlterationObserverobserver=newFileAlterationObserver(parentDir); observer.addListener(newFileAlterationListenerAdaptor(){ @Override publicvoidonFileCreate(Filefile){ System.out.println("Filecreated:"+file.getName()); } @Override publicvoidonFileDelete(Filefile){ System.out.println("Filedeleted:"+file.getName()); } @Override publicvoidonDirectoryCreate(Filedir){ System.out.println("Directorycreated:"+dir.getName()); } @Override publicvoidonDirectoryDelete(Filedir){ System.out.println("Directorydeleted:"+dir.getName()); } }); //Addamoniorthatwillcheckforeventseveryxms, //andattachallthedifferentobserversthatwewant. FileAlterationMonitormonitor=newFileAlterationMonitor(500,observer); try{ monitor.start(); //Afterweattachedthemonitor,wecancreatesomefilesanddirectories //andseewhathappens! FilenewDir=newFile(NEW_DIR); FilenewFile=newFile(NEW_FILE); newDir.mkdirs(); newFile.createNewFile(); Thread.sleep(1000); FileDeleteStrategy.NORMAL.delete(newDir); FileDeleteStrategy.NORMAL.delete(newFile); Thread.sleep(1000); monitor.stop(); }catch(IOExceptione){ e.printStackTrace(); }catch(InterruptedExceptione){ e.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); } } }
输出如下:
Java代码FileMonitorexample... Filemonitored:C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleFileEntry.txt Filename:exampleFileEntry.txt Isthefileadirectory?:false Directorycreated:newDir Filecreated:newFile.txt Directorydeleted:newDir Filedeleted:newFile.txt

上面的特性的确很赞!分析下,这个工具类包下的工具类,可以允许我们创建跟踪文件或目录变化的监听句柄,当文件目录等发生任何变化,都可以用“观察者”的身份进行观察,
其步骤如下:
1) 创建要监听的文件对象
2) 创建FileAlterationObserver 监听对象,在上面的例子中,
File parentDir = FileUtils.getFile(PARENT_DIR);
FileAlterationObserver observer = new FileAlterationObserver(parentDir);
创建的是监视parentDir目录的变化,
3) 为观察器创建FileAlterationListenerAdaptor的内部匿名类,增加对文件及目录的增加删除的监听
4) 创建FileAlterationMonitor监听类,每隔500ms监听目录下的变化,其中开启监视是用monitor的start方法即可。

三 过滤器 filters
先看例子:
Java代码importjava.io.File; importorg.apache.commons.io.FileUtils; importorg.apache.commons.io.IOCase; importorg.apache.commons.io.filefilter.AndFileFilter; importorg.apache.commons.io.filefilter.NameFileFilter; importorg.apache.commons.io.filefilter.NotFileFilter; importorg.apache.commons.io.filefilter.OrFileFilter; importorg.apache.commons.io.filefilter.PrefixFileFilter; importorg.apache.commons.io.filefilter.SuffixFileFilter; importorg.apache.commons.io.filefilter.WildcardFileFilter; publicfinalclassFiltersExample{ privatestaticfinalStringPARENT_DIR= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder"; publicstaticvoidrunExample(){ System.out.println("FileFilterexample..."); //NameFileFilter //Rightnow,intheparentdirectorywehave3files: //directoryexample //fileexampleEntry.txt //fileexampleTxt.txt //Getallthefilesinthespecifieddirectory //thatarenamed"example". Filedir=FileUtils.getFile(PARENT_DIR); String[]acceptedNames={"example","exampleTxt.txt"}; for(Stringfile:dir.list(newNameFileFilter(acceptedNames,IOCase.INSENSITIVE))){ System.out.println("Filefound,named:"+file); } //WildcardFileFilter //Wecanusewildcardsinordertogetlessspecificresults //?usedfor1missingchar //*usedformultiplemissingchars for(Stringfile:dir.list(newWildcardFileFilter("*ample*"))){ System.out.println("Wildcardfilefound,named:"+file); } //PrefixFileFilter //WecanalsousetheequivalentofstartsWith //forfilteringfiles. for(Stringfile:dir.list(newPrefixFileFilter("example"))){ System.out.println("Prefixfilefound,named:"+file); } //SuffixFileFilter //WecanalsousetheequivalentofendsWith //forfilteringfiles. for(Stringfile:dir.list(newSuffixFileFilter(".txt"))){ System.out.println("Suffixfilefound,named:"+file); } //OrFileFilter //Wecanusesomefiltersoffilters. //inthiscase,weuseafiltertoapplyalogical //orbetweenourfilters. for(Stringfile:dir.list(newOrFileFilter( newWildcardFileFilter("*ample*"),newSuffixFileFilter(".txt")))){ System.out.println("Orfilefound,named:"+file); } //Andthiscanbecomeverydetailed. //Eg,getallthefilesthathave"ample"intheirname //buttheyarenottextfiles(sotheyhaveno".txt"extension. for(Stringfile:dir.list(newAndFileFilter(//wewillmatch2filters... newWildcardFileFilter("*ample*"),//...the1stisawildcard... newNotFileFilter(newSuffixFileFilter(".txt"))))){//...andthe2ndisNOT.txt. System.out.println("And/Notfilefound,named:"+file); } } }
可以看清晰看到,使用过滤器,可以分别在指定的目录下,寻找符合条件
的文件,比如以什么开头的文件名,支持通配符,甚至支持多个过滤器进行或的操作!
输出如下:
Java代码FileFilterexample... Filefound,named:example Filefound,named:exampleTxt.txt Wildcardfilefound,named:example Wildcardfilefound,named:exampleFileEntry.txt Wildcardfilefound,named:exampleTxt.txt Prefixfilefound,named:example Prefixfilefound,named:exampleFileEntry.txt Prefixfilefound,named:exampleTxt.txt Suffixfilefound,named:exampleFileEntry.txt Suffixfilefound,named:exampleTxt.txt Orfilefound,named:example Orfilefound,named:exampleFileEntry.txt Orfilefound,named:exampleTxt.txt And/Notfilefound,named:example


四 Comparators比较器
org.apache.commons.io.comparator包下的工具类,可以方便进行文件的比较:
Java代码importjava.io.File; importjava.util.Date; importorg.apache.commons.io.FileUtils; importorg.apache.commons.io.IOCase; importorg.apache.commons.io.comparator.LastModifiedFileComparator; importorg.apache.commons.io.comparator.NameFileComparator; importorg.apache.commons.io.comparator.SizeFileComparator; publicfinalclassComparatorExample{ privatestaticfinalStringPARENT_DIR= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder"; privatestaticfinalStringFILE_1= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\example"; privatestaticfinalStringFILE_2= "C:\Users\Lilykos\workspace\ApacheCommonsExample\ExampleFolder\exampleTxt.txt"; publicstaticvoidrunExample(){ System.out.println("Comparatorexample..."); //NameFileComparator //Let'sgetadirectoryasaFileobject //andsortallitsfiles. FileparentDir=FileUtils.getFile(PARENT_DIR); NameFileComparatorcomparator=newNameFileComparator(IOCase.SENSITIVE); File[]sortedFiles=comparator.sort(parentDir.listFiles()); System.out.println("Sortedbynamefilesinparentdirectory:"); for(Filefile:sortedFiles){ System.out.println("t"+file.getAbsolutePath()); } //SizeFileComparator //Wecancomparefilesbasedontheirsize. //Thebooleanintheconstructorisaboutthedirectories. //true:directory'scontentscounttothesize. //false:directoryisconsideredzerosize. SizeFileComparatorsizeComparator=newSizeFileComparator(true); File[]sizeFiles=sizeComparator.sort(parentDir.listFiles()); System.out.println("Sortedbysizefilesinparentdirectory:"); for(Filefile:sizeFiles){ System.out.println("t"+file.getName()+"withsize(kb):"+file.length()); } //LastModifiedFileComparator //Wecanusethisclasstofindwhichfilewasmorerecentlymodified. LastModifiedFileComparatorlastModified=newLastModifiedFileComparator(); File[]lastModifiedFiles=lastModified.sort(parentDir.listFiles()); System.out.println("Sortedbylastmodifiedfilesinparentdirectory:"); for(Filefile:lastModifiedFiles){ Datemodified=newDate(file.lastModified()); System.out.println("t"+file.getName()+"lastmodifiedon:"+modified); } //Or,wecanalsocompare2specificfilesandfindwhichonewaslastmodified. //returns>0ifthefirstfilewaslastmodified. //returns0) System.out.println("File"+file1.getName()+"wasmodifiedlastbecause..."); else System.out.println("File"+file2.getName()+"wasmodifiedlastbecause..."); System.out.println("t"+file1.getName()+"lastmodifiedon:"+ newDate(file1.lastModified())); System.out.println("t"+file2.getName()+"lastmodifiedon:"+ newDate(file2.lastModified())); } }

输出如下:
Java代码Comparatorexample... Sortedbynamefilesinparentdirectory: C:UsersLilykosworkspaceApacheCommonsExampleExampleFoldercomparator1.txt C:UsersLilykosworkspaceApacheCommonsExampleExampleFoldercomperator2.txt C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexample C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleFileEntry.txt C:UsersLilykosworkspaceApacheCommonsExampleExampleFolderexampleTxt.txt Sortedbysizefilesinparentdirectory: examplewithsize(kb):0 exampleTxt.txtwithsize(kb):87 exampleFileEntry.txtwithsize(kb):503 comperator2.txtwithsize(kb):1458 comparator1.txtwithsize(kb):4436 Sortedbylastmodifiedfilesinparentdirectory: exampleTxt.txtlastmodifiedon:SunOct2614:02:22EET2014 examplelastmodifiedon:SunOct2623:42:55EET2014 comparator1.txtlastmodifiedon:TueOct2814:48:28EET2014 comperator2.txtlastmodifiedon:TueOct2814:48:52EET2014 exampleFileEntry.txtlastmodifiedon:TueOct2814:53:50EET2014 Fileexamplewasmodifiedlastbecause... examplelastmodifiedon:SunOct2623:42:55EET2014 exampleTxt.txtlastmodifiedon:SunOct2614:02:22EET2014


可以看到,在上面的代码中
NameFileComparator: 文件名的比较器,可以进行文件名称排序;
SizeFileComparator: 按照文件大小比较
LastModifiedFileComparator: 根据最新修改日期比较

五 input包
在 common io的org.apache.commons.io.input 包中,有各种对InputStream的实现类:
我们看下其中的TeeInputStream, ,它接受InputStream和Outputstream参数,例子如下:
Java代码importjava.io.ByteArrayInputStream; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.IOException; importorg.apache.commons.io.FileUtils; importorg.apache.commons.io.input.TeeInputStream; importorg.apache.commons.io.input.XmlStreamReader; publicfinalclassInputExample{ privatestaticfinalStringXML_PATH= "C:\Users\Lilykos\workspace\ApacheCommonsExample\InputOutputExampleFolder\web.xml"; privatestaticfinalStringINPUT="Thisshouldgototheoutput."; publicstaticvoidrunExample(){ System.out.println("Inputexample..."); XmlStreamReaderxmlReader=null; TeeInputStreamtee=null; try{ //XmlStreamReader //Wecanreadanxmlfileandgetitsencoding. Filexml=FileUtils.getFile(XML_PATH); xmlReader=newXmlStreamReader(xml); System.out.println("XMLencoding:"+xmlReader.getEncoding()); //TeeInputStream //Thisveryusefulclasscopiesaninputstreamtoanoutputstream //andclosesbothusingonlyoneclose()method(bydefiningthe3rd //constructorparameterastrue). ByteArrayInputStreamin=newByteArrayInputStream(INPUT.getBytes("US-ASCII")); ByteArrayOutputStreamout=newByteArrayOutputStream(); tee=newTeeInputStream(in,out,true); tee.read(newbyte[INPUT.length()]); System.out.println("Outputstream:"+out.toString()); }catch(IOExceptione){ e.printStackTrace(); }finally{ try{xmlReader.close();} catch(IOExceptione){e.printStackTrace();} try{tee.close();} catch(IOExceptione){e.printStackTrace();} } } }

输出:
Java代码Inputexample... XMLencoding:UTF-8 Outputstream:Thisshouldgototheoutput.
tee = new TeeInputStream(in, out, true);
中,分别三个参数,将输入流的内容输出到输出流,true参数为最后关闭流
六 output工具类包

其中的org.apache.commons.io.output 是实现了outputstream,其中好特别的是
TeeOutputStream能将一个输入流分别输出到两个输出流
Java代码importjava.io.ByteArrayInputStream; importjava.io.ByteArrayOutputStream; importjava.io.IOException; importorg.apache.commons.io.input.TeeInputStream; importorg.apache.commons.io.output.TeeOutputStream; publicfinalclassOutputExample{ privatestaticfinalStringINPUT="Thisshouldgototheoutput."; publicstaticvoidrunExample(){ System.out.println("Outputexample..."); TeeInputStreamteeIn=null; TeeOutputStreamteeOut=null; try{ //TeeOutputStream ByteArrayInputStreamin=newByteArrayInputStream(INPUT.getBytes("US-ASCII")); ByteArrayOutputStreamout1=newByteArrayOutputStream(); ByteArrayOutputStreamout2=newByteArrayOutputStream(); teeOut=newTeeOutputStream(out1,out2); teeIn=newTeeInputStream(in,teeOut,true); teeIn.read(newbyte[INPUT.length()]); System.out.println("Outputstream1:"+out1.toString()); System.out.println("Outputstream2:"+out2.toString()); }catch(IOExceptione){ e.printStackTrace(); }finally{ //NoneedtocloseteeOut.WhenteeIncloses,itwillalsocloseits //Outputstream(whichisteeOut),whichwillinturnclosethe2 //branches(out1,out2). try{teeIn.close();} catch(IOExceptione){e.printStackTrace();} } } }

输出:
Java代码Outputexample... Outputstream1:Thisshouldgototheoutput. Outputstream2:Thisshouldgototheoutput.





本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭