Преобразование файла Java://URL-адрес в файл (...), независимый от платформы, включая пути UNC
Я разрабатываю независимое от платформы приложение. Я получаю URL-адрес файла *.
В окнах это:
Я использую new File(URI(urlOfDocument).getPath())
, который отлично работает с первым, а также в Unix, Linux, OS X, но не работает с UNC-путями.
Каков стандартный способ конвертировать файлы: URL-адреса в файлы (..), совместимые с Java 6?
......
*
Примечание. Я получаю тезисы URL из OpenOffice/LibreOffice (XModel.getURL()).
Ответы
Ответ 1
Основываясь на подсказке и ссылке, приведенной в ответе Симоны Джаннис, это мой взлом, чтобы исправить это.
Я тестирую uri.getAuthority(), потому что путь UNC будет сообщать о полномочиях. Это ошибка - поэтому я полагаюсь на существование ошибки, которая является злой, но она кажется, что это останется навсегда (поскольку Java 7 решает проблему в java.nio.Paths).
Примечание. В моем контексте я получаю абсолютные пути. Я тестировал это на Windows и OS X.
(Все еще ищет лучший способ сделать это)
package com.christianfries.test;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
public class UNCPathTest {
public static void main(String[] args) throws MalformedURLException, URISyntaxException {
UNCPathTest upt = new UNCPathTest();
upt.testURL("file://server/dir/file.txt"); // Windows UNC Path
upt.testURL("file:///Z:/dir/file.txt"); // Windows drive letter path
upt.testURL("file:///dir/file.txt"); // Unix (absolute) path
}
private void testURL(String urlString) throws MalformedURLException, URISyntaxException {
URL url = new URL(urlString);
System.out.println("URL is: " + url.toString());
URI uri = url.toURI();
System.out.println("URI is: " + uri.toString());
if(uri.getAuthority() != null && uri.getAuthority().length() > 0) {
// Hack for UNC Path
uri = (new URL("file://" + urlString.substring("file:".length()))).toURI();
}
File file = new File(uri);
System.out.println("File is: " + file.toString());
String parent = file.getParent();
System.out.println("Parent is: " + parent);
System.out.println("____________________________________________________________");
}
}
Ответ 2
Основываясь на комментарии @SotiriosDelimanolis, вот метод для работы с URL-адресами (такими как file:...) и не-URL-адресами (такими как C:...), используя Spring FileSystemResource:
public FileSystemResource get(String file) {
try {
// First try to resolve as URL (file:...)
Path path = Paths.get(new URL(file).toURI());
FileSystemResource resource = new FileSystemResource(path.toFile());
return resource;
} catch (URISyntaxException | MalformedURLException e) {
// If given file string isn't an URL, fall back to using a normal file
return new FileSystemResource(file);
}
}
Ответ 3
Java (по крайней мере 5 и 6, java 7 Paths most) имеет проблему с UNC и URI. Команда Eclipse завернула его здесь: http://wiki.eclipse.org/Eclipse/UNC_Paths
Из java.io.File javadocs префикс UNC "////", а java.net.URI обрабатывает файл:////host/path (четыре слэша).
Подробнее о том, почему это происходит, и о возможных проблемах, возникающих в других методах URI и URL, можно найти в списке ошибок в конце указанной выше ссылки.
Используя эту информацию, команда Eclipse разработала класс org.eclipse.core.runtime.URIUtil, исходный код которого, вероятно, может помочь при работе с UNC-путями.
Ответ 4
Я надеюсь (точно не проверено), что более новая java привела пакет nio и Path. Надеюсь, он исправил:
String s="C:\\some\\ile.txt";
System.out.println(new File(s).toPath().toUri());
Ответ 5
Для Java 8 работает следующий метод:
- Сформировать URI из строки файла URI
- Создать файл из URI (не напрямую из строки URI, абсолютные строки URI не являются путями)
См. Ниже фрагмент кода
String fileURiString="file:///D:/etc/MySQL.txt";
URI fileURI=new URI(fileURiString);
File file=new File(fileURI);//File file=new File(fileURiString) - will generate exception
FileInputStream fis=new FileInputStream(file);
fis.close();