Создайте функцию для File.separator, используя Pattern Matcher - PullRequest
0 голосов
/ 17 мая 2018

Инструмент статического анализа при запуске в моем Java-проекте выдает ошибку «Ошибка переносимости в разделителе файлов», и мне нужно ее исправить. В моем коде у меня есть файл небезопасный. Я хочу использовать метод для преобразования его в fileSafe (объяснено ниже).

// Case 1
//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");

//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

Аналогично для путей типа -

// Case 2
//no platform independence, good for Unix systems
File fileUnsafe = new File("/tmp/abc.txt");

// platform independent and safe to use across Unix and Windows
File fileSafe = new File(File.separator+"tmp"+File.separator+"abc.txt");

У меня есть несколько таких файловых адресов в моем проекте, и мне нужно создать какой-нибудь метод преобразования, который мог бы просто взять этот путь в виде строки, добавить к нему File.separator и вернуть его. Как то так -

File fileSafe = new File(someConversionMethod("/tmp/abc.txt"));

Я попробовал этот метод, но он дает мне NullPointerException в случае 2.

public static String someConversionMethod(String target) {
        Pattern ptr = Pattern.compile("[\\\\\\\\|/]+");
        Matcher mtr = ptr.matcher(target);
        return mtr.replaceAll(File.separator + "" + File.separator);
    }

Буду признателен за любую помощь в исправлении этого метода или предложении изящного способа справиться с этой ситуацией.

nit - я ссылался на Замена символа на File.separator с помощью java.regex Pattern Matcher , но это не очень помогло в моем случае.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Поскольку это однократное изменение, вы можете использовать регулярное выражение найти и заменить в Eclipse

Для первого случая: используйте регулярное выражение: ^File\sfileUnsafe\s=\snew File\(\"(?<folder1>[^\/]+)\/(?<fileName>[^\.]+)(?<extension>\.\w{3})\"\);

Заменить на: File fileSafe = new File("${folder1}"+File.separator+"${fileName}${extension}");

Демонстрация

Для второго случая: используйте регулярное выражение: ^File\sfileUnsafe\s=\snew File\(\"\/(?<folder1>[^\/]+)\/(?<fileName>[^\.]+)(?<extension>\.\w{3})\"\);

Заменить на: File fileSafe = new File(File.separator+"${folder1}"+File.separator+"${fileName}${extension}");

Демо

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

Признаю, это не чистый прямой путь, но он получитработа сделана.

0 голосов
/ 17 мая 2018

Я бы попробовал разбить строку в разделителе файлов на массив, например, так.

String str = "/tmp/abc.txt";
String result = "";
String rgx = "\\\\|/";
String [] arrOfStr = str.split(rgx);;

Затем вы можете добавить File.separator обратно в цикл for.Вот так:

    for (int i = 1; i < arrOfStr.length ; i++)
        result += File.separator + arrOfStr[i];

Я начинаю с индекса один, потому что первая полученная косая черта в полученной строке удваивается.

...