我有一个完整的文件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];