Преобразование в переносимый путь к файлу - PullRequest
2 голосов
/ 17 апреля 2011
public static String getPortableFilePath(String target)    
{
Pattern ptr=Pattern.compile("[\\|/]+");
Matcher mtr=ptr.matcher(target);
return mtr.replaceAll(File.separator);  
}

public static void main(String[] args)
{
   System.out.println(getPortableFilePath("C:///Program Files////Java\\jdk1.6.0_23/bin"));  
}

В приведенном выше коде я пытаюсь заменить все прямые и обратные косые черты с помощью текущего системного разделителя файлов.Код прекрасно компилируется, когда помещается в класс, но при выполнении он дает исключение индекса массива за пределами границ.Есть догадки почему?

Исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1

at java.lang.String.charAt(Unknown Source)
at java.util.regex.Matcher.appendReplacement(Unknown Source)
at java.util.regex.Matcher.replaceAll(Unknown Source)
at Files.getPortableFilePath
at Files.main

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

Ваш метод (а) ошибочно назван и (б) не нужен.Неправильный, потому что он не возвращает переносимый путь к файлу, он возвращает путь для текущей системы;не нужно, потому что если вы просто используете / везде, Java будет работать правильно на всех платформах.Никогда не нужно использовать обратную косую черту в именах файлов Java.

2 голосов
/ 17 апреля 2011

Вам нужно получить два обратных слэша через движок регулярных выражений.В противном случае он будет думать, что вы избегаете следующего персонажа.Поэтому используйте

"[\\\\/]+"

для строки шаблона.Таким образом, он разрешается в шаблон

[\\/]+

. Это проблема со строкой и нотацией регулярного выражения, которые используют обратную косую черту, и нет способа пропустить этап интерполяции строки.

Ине используйте вертикальную трубу в квадратных скобках: это буквально там.

0 голосов
/ 18 апреля 2011

Спасибо за ответы, ребята. Наконец-то нашел проблему.

Я заменил

Pattern ptr=Pattern.compile("[\\\\/]+");

с

Pattern ptr=Pattern.compile("[\\\\\\\\|/]+");

как отметил tchrist, это было необходимо, но все равно не исправило ошибку.

Ошибка была исправлена ​​заменой

return mtr.replaceAll(File.separator);

строка с

return mtr.replaceAll(File.separator+""+File.separator);

Так как я работаю в среде Windows, File.separator вернул "\", который сам по себе работал как символ экранирования, и была отображена ошибка, и именно поэтому оригинальный код прекрасно работал на Mac Джима Блэклера, потому что File.separator для него не было "\".

Но все же я не мог понять, за исключением StringIndexoutOfBounds, что здесь должно делать это исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...