2012-04-26 149 views
14

我有一個完整的文件路徑,我想獲取文件名。使用系統文件分隔符分割文件名

我使用下面的指令:

String[] splittedFileName = fileName.split(System.getProperty("file.separator")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 

但在Windows它給:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 
\ 
^ 

我能避免此異常?有一個更好的方法嗎?

回答

34

問題是\必須轉義才能在正則表達式中使用它作爲反斜槓。您應該使用splitting API which doesn't use regular expressions,或使用Pattern.quote第一:

// Alternative: use Pattern.quote(File.separator) 
String pattern = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(pattern); 

甚至更​​好,使用File API此:

File file = new File(fileName); 
String simpleFileName = file.getName(); 
3

當你寫一個文件名,你應該使用System.getProperty("file.separator")

當您讀取文件名時,您可能會將正斜槓或反斜槓作爲文件分隔符。

你可能想嘗試以下操作:

所有的
fileName = fileName.replace("\\", "/"); 
String[] splittedFileName = fileName.split("/")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
+0

感謝@Gilbert Le Blanc,好的一段代碼!簡單和偉大的作品! – 2016-01-04 15:56:57

0

首先,對於這個特定的問題,我建議使用java.util.File類,而不是一個正則表達式。

這就是說,您遇到的問題的根源在於反斜槓字符'\'表示Java正則表達式中的轉義序列。正在發生的事情是,正則表達式解析器看到反斜槓並期待它後面會有另一個字符,它將完成轉義序列。解決這個問題的最簡單方法是使用java.util.regex.Pattern.quote()方法,該方法將轉義您提供的字符串中的任何特殊字符。

有了這個改變你的代碼變成:

String splitRegex = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(splitRegex); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
2

另一種更簡單的方法可以做到

File f = new File(path); 
String fileName = f.getName(); 

我相信這會工作提供的路徑與平臺兼容,即不知道路徑「c:\ file.txt」可以在Linux上運行或不運行。