Ответ 1
Это допустимый файл 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.
У меня мало знаний о Java. Мне нужно построить строковое представление URI из FilePath(String)
в окнах. Иногда inputFilePath
я получаю: file:/C:/a.txt
, а иногда это: C:/a.txt
. Прямо сейчас, я делаю:
new File(inputFilePath).toURI().toURL().toExternalForm()
Вышеописанное отлично работает для путей, которые не имеют префикса с file:/
, но для путей, префиксных с помощью file:/
, метод. toURI
преобразует его в недопустимый URI, добавляя значение текущего dir и поэтому путь становится недействительным.
Пожалуйста, помогите мне, предложив правильный способ получить правильный URI для обоих типов путей.
Это допустимый файл 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.
Из 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;
}
Просто используйте Normalize();
Пример:
path = Paths.get("/", input).normalize();
эта строка будет нормализовать все ваши пути.
Аргумент new File(String)
- это путь, а не URI. Таким образом, часть вашего сообщения после "но" является неправильным использованием API.
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 . . .