Java中用到文件操做時,常常要驗證文件名是否合法. 用File類的createNewFile()方法的確很管用.但當要批量驗證時,效率上就會有問題.正則匹配的開銷比建立文件少了不少. 那麼一個合法的文件(Win下)應該符合以下規則:java
1.文件名不能爲空,空在這裏有兩個意思:get
文件名(包括擴展名)長度爲0或僅由空字符組成(包括\t\b等不可見的轉義字符) 文件名和擴展名不能同時爲空.但實際上咱們能夠用程序建立出相似.project,..txt等形式的文件,但卻建立不出相似abc.的文件 2.文件名中不能包含/:*?"<>|中的任意字符效率
因而咱們獲得了文件名命名規則的更詳細規定:擴展
1.首尾不能有空字符(空格、製表符、換頁符等空白字符的其中任意一個),文件名尾不能爲.號file
2.文件名和擴展名不能同時爲空程序
3.文件名中不能包含/:*?"<>|中的任意字符方法
4.文件名(包括擴展名)的長度不得大於255個字符命名
5.在1.的條件下,文件名中不能出出現除空格符外的任意空字符.static
出 現控制字符其實也算不合法,但由於狀況太複雜,就不作判斷了。 因而有以下匹配 首字符: [^\s\/:*?"<>|]尾字符: [^\s\/:*?"<>|.]其它字符: (\x20|[^\s\/:*?"<>|])* \s 只能匹配下面六種字符(via: java.util.regex.Pattern): 半角空格( ) 水平製表符(\t) 豎直製表符 回車(\r) 換行(\n) 換頁符(\f)語言
用Java語言實現:
public static boolean isValidFileName(String fileName) { if (fileName == null || fileName.length() > 255) return false; else return fileName.matches("^\s\\/:\*\?\"<>\|[^\s\\/:\\?\"<>\|\.]$"); }