Подтвердить что ты не робот

Разбиение имен файлов с использованием символа разделителя системных файлов

У меня есть полный путь к файлу, и я хочу получить имя файла.

Я использую следующую инструкцию:

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

Можно ли избежать этого исключения? Есть ли лучший способ сделать это?

4b9b3361

Ответ 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];