使用Apache commons IO包规范文件名

系统 1728 0

【一】Apache commons IO包之FilenameUtils

在使用JDK的File类构建目录、文件对象时,通常会碰到以下的问题:

 ①分隔符的问题:Unix系统和Windos系统的路径分隔符、换行符不同
 ②路径规范的问题:有些API对于返回的目录路径不带"/",有些则有
 ③文件名规范的问题:有些文件名中间带有空格,导致程序解析错误

上面的问题虽然不算复杂,却也恼人。有时候甚至会在这些问题上耗费大量的时间。于是Apache commons io包提供了一个FilenameUtils类来专门帮助我们解决这样的问题。根据Apache common io的说法:你可以通过使用JDK自带的File类构造方法File(String parent, String child)来避免使用这个类,但是实际上这个类还是很有用的!

【二】Apache commons IO包中对路径的定义

要了解Apache commons IO包如何处理路径文件名的问题,首先要知道Apache中如何定义关于路径的参数:
使用Apache commons IO包规范文件名
关于路径有3个概念:
 ①前缀:盘符或者根目录
 ②路径:从前缀或根目录开始直至文件的所在目录
 ③全路径:包含了前缀和路径

要注意的是:在Apache的所以关于路径的概念中,都是以分隔符结尾的。因为按照Apache的说法,如果没有提供分隔符,它将不能正确地识别路径代表的是一个目录还是一个文件,在这种情况下只能选择将其识别为一个文件。

关于文件名也有3个概念:
 ①基本名称:不包含路径和扩展名的部分
 ②扩展名称:从.开始直至结束的部分
 ③文件名称:包含了基本名称和扩展名称

要注意的是:扩展名并不包含"."

在路径概念中,前缀是一个很重要的概念:因为它告诉了程序应该从那里开始识别,在Apache commons IO包中,使用如下规则去获取前缀:
使用Apache commons IO包规范文件名

【三】常用API

①路径规范

首先要介绍的就是normalize方法,这个方法用于对各种类型的路径进行规范,它的规则如下:

A trailing slash will be retained.
A double slash will be merged to a single slash (but UNC names are handled).
A single dot path segment will be removed.
A double dot will cause that path segment and the one before to be removed.
If the double dot has no parent path segment to work with, null is returned


下面是官网上面的一个例子:
使用Apache commons IO包规范文件名

要特别注意的是:这个方法总是会返回一个结尾带有"/"的路径,如果你不需要这个分隔符,那么你可以调用另外一个方法:normalizeNoEndSeparator(String filename)。

②路径的比较

有点时候我们需要比较两个路径是否代表了同一个资源,但是由于路径写法或者API调用的不同,即便同一个对象也有可能返回false的结果。于是Apache提供了一个直接简便的方法:equals。这个方法的完整签名是:

 static boolean equals(String filename1, String filename2,
                               boolean normalized, IOCase caseSensitivity)

其中normalized参数表示在比较前是否要进行规范,通常都是true,参数caseSensitivity表示是否大小写敏感。这个参数有3个可选择的选项,他们分别是:
 ※ IOCase.INSENSITIVE
 ※ IOCase.SENSITIVE
 ※ IOCase.SYSTEM

通常为了移植性我们都会选择IOCase.SYSTEM,即根据系统的类型自动决定。

③路径获取

分为path和full path两种情况,可用的API有:

 ※ getFullPath(String filename)/getFullPathNoEndSeparator(String filename)
 ※ getPath(String filename)/getPathNoEndSeparator(String filename)
 
④路径的截取

包含了对扩展名的位置判断和分隔符的位置判断。设想一下假如现在有这样的一个路径:C:/path/my.file/you.txt

如果我们要获取扩展名,使用indexOf('.'),那么返回的将是错误的结果。使用Apache commons IO提供的indexOfExtension(String filename)方法,将会首先检查在"."后是否还有"/"分隔符。

该方法内部默认调用了另外一个方法:indexOfLastSeparator(String filename)

⑤文件名的获取

分为全文件名,基本文件名,扩展名。可用的API有:

 ※ getName(String filename)
 ※ getBaseName(String filename)
 ※ getExtension(String filename)

使用Apache commons IO包规范文件名


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论