Разбиение имен файлов с использованием символа разделителя системных файлов
У меня есть полный путь к файлу, и я хочу получить имя файла.
Я использую следующую инструкцию:
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
\
^
Можно ли избежать этого исключения? Есть ли лучший способ сделать это?
Ответы
Ответ 1
Проблема заключается в том, что \
необходимо экранировать, чтобы использовать его как обратную косую черту в регулярном выражении. Вы должны использовать API который не использует регулярные выражения, или сначала используйте Pattern.quote
:
// Alternative: use Pattern.quote(File.separator)
String pattern = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(pattern);
Или даже лучше, используйте API File
для этого:
File file = new File(fileName);
String simpleFileName = file.getName();
Ответ 2
Когда вы пишете имя файла, вы должны использовать System.getProperty("file.separator")
.
Когда вы читаете имя файла, вы можете иметь либо косую черту, либо обратную косую черту в качестве разделителя файлов.
Возможно, вы захотите попробовать следующее:
fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
Ответ 3
Другим более простым способом может быть выполнение
File f = new File(path);
String fileName = f.getName();
Я считаю, что это будет работать, если пути совместимы с платформой, то есть не уверены, будет ли путь "c:\file.txt" работать в Linux или нет.
Ответ 4
Прежде всего, для этой конкретной проблемы я бы рекомендовал использовать класс java.util.File вместо регулярного выражения.
При этом корень проблемы, с которой вы сталкиваетесь, заключается в том, что символ обратной косой черты "\" означает escape-последовательность в регулярных выражениях Java. Что происходит, парсер регулярных выражений видит обратную косую черту и ожидает, что после него будет другой символ, который завершит escape-последовательность. Самый простой способ обойти это - использовать метод java.util.regex.Pattern.quote(), который избежит любых специальных символов в строке, которую вы ему даете.
С этим изменением ваш код будет выглядеть следующим образом:
String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];