2012-04-26 117 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上运行或不运行。