使用系统文件分隔符分割文件名

我有一个完整的文件path,我想获得文件名。

我正在使用以下指令:

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 \ ^ 

我可以避免这种exception吗? 有一个更好的方法吗?

问题是\必须被转义才能在正则表达式中使用它作为反斜杠 。 您应该使用使用正则表达式的分割API ,或者先使用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(); 

当你写一个文件名,你应该使用System.getProperty("file.separator")

当你读取一个文件名,你可能会有正斜杠或反斜杠作为文件分隔符。

您可能想要尝试以下操作:

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

另一个更简单的方法可能是做

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

我相信这将工作提供的路径是兼容的平台,即不知道路径“C:\ file.txt”将在Linux上工作或不。

首先,对于这个特定的问题,我建议使用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];