Java: получить URI из FilePath - PullRequest
       48

Java: получить URI из FilePath

16 голосов
/ 30 ноября 2011

Я немного знаю Java. Мне нужно построить строковое представление URI из FilePath(String) в Windows. Иногда inputFilePath, который я получаю: file:/C:/a.txt, а иногда это: C:/a.txt. Прямо сейчас я делаю следующее:

new File(inputFilePath).toURI().toURL().toExternalForm()

Вышеприведенное прекрасно работает для путей, которые не имеют префикса file:/, но для путей с префиксом file:/, метод. toURI преобразует его в недопустимый URI, добавляя значение текущего dir, и следовательно, путь становится недействительным.

Пожалуйста, помогите мне, предложив правильный способ получить правильный URI для обоих типов путей.

Ответы [ 5 ]

12 голосов
/ 30 ноября 2011

Это действительный файл uri:

file:/C:/a.txt            <- On Windows
file:///C:/a.txt          <- On Windows
file:///home/user/a.txt   <- On Linux

Так что вам нужно будет удалить file:/ или file:/// для Windows и file:// для Linux.

5 голосов
/ 19 сентября 2013

Из SAXLocalNameCount.java из https://jaxp.java.net:

/**
 * Convert from a filename to a file URL.
 */
private static String convertToFileURL ( String filename )
{
    // On JDK 1.2 and later, simplify this to:
    // "path = file.toURL().toString()".
    String path = new File ( filename ).getAbsolutePath ();
    if ( File.separatorChar != '/' )
    {
        path = path.replace ( File.separatorChar, '/' );
    }
    if ( !path.startsWith ( "/" ) )
    {
        path = "/" + path;
    }
    String retVal =  "file:" + path;

    return retVal;
}
4 голосов
/ 21 января 2015

Просто используйте Normalize();

Пример:

path = Paths.get("/", input).normalize();

эта строка нормализует все ваши пути.

2 голосов
/ 30 ноября 2011

Аргументом new File(String) является путь, а не URI.Поэтому часть вашего сообщения после «но» является недопустимым использованием API.

0 голосов
/ 30 ноября 2011
class TestPath {

    public static void main(String[] args) {
        String brokenPath = "file:/C:/a.txt";

        System.out.println(brokenPath);

        if (brokenPath.startsWith("file:/")) {
            brokenPath = brokenPath.substring(6,brokenPath.length());
        }
        System.out.println(brokenPath);
    }
}

Дает вывод:

file:/C:/a.txt
C:/a.txt
Press any key to continue . . .
...