2012-01-09 2 views
26

Java7 поставляется с реализацией по умолчанию Path для локальных файлов. Есть ли реализация пути для URL-адресов?java.nio.file.Path для URL-адресов?

Например, я должен быть в состоянии скопировать удаленный ресурс, используя следующий код:

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html")); 
Path local = Paths.get(new URI("/bar.html")); 
Files.copy(remote, local); 

В настоящее время, это бросает java.nio.file.FileSystemNotFoundException: Provider "http" not installed. Возможно, я мог бы реализовать это сам, но я бы не стал изобретать велосипед.

+0

Что против файлов.copy (InputStream, Path)? Есть ли URL-адреса в мире, который является сетью? Или они больше похожи на указатель? Что вы можете получить? –

+0

@owlstead. Моя библиотека должна возвращать непрозрачные пути пользователям. Они могут копировать эти (только для чтения) пути в локальную файловую систему, не требуя знать или не заботиться о том, находится ли файл локально (т. Е. В базе данных) или удаленно (веб-сервер). В InputStream отсутствуют атрибуты, которые я хотел бы предоставить своим пользователям, например имя файла или временную метку lastModified. – Gili

+0

Понял, но то, что пользователи видят, не обязательно должно быть отражено основной реализацией. –

ответ

3

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

URI не являются файловыми дорожками, поэтому вы не можете рассматривать их как таковые. Это адресаты/локаторы ресурсов, которые, когда вы отправляетесь туда с вашим браузером (или другим клиентом, который их обрабатывает), запускают некоторые действия, определенные сервером, который находится за ними. Для того, что делает этот сервер, нет стандарта, следовательно, гибкость веб-сервисов. Поэтому, если ваш сервер делает так, чтобы принимать HTTP-запросы таким образом, чтобы облегчить копирование файлов, вам придется сворачивать свои собственные и передавать данные файла в запрос POST.

Чтобы сказать это по-другому, (1) не обрабатывать URI, как они являются файловыми путями - они не являются, (2) найти FTP-библиотеку для копирования файлов и/или (3), если вы действительно хотите создать веб-службу, которая делает это, абстрагировать детали копирования файлов через запрос POST. Если вы №3 понимаете, что ваше здание довольно близко к обычаю, и что оно, вероятно, будет работать только на подмножестве сайтов, которые следуют вашему конкретному дизайну (т. Е. Те, которые вы сами создаете). Нет стандартного набора параметров или «копирования файлов» через команду POST, что я знаю, что вы можете использовать это, чтобы «просто работать» - вам придется сопоставлять свой HTTP-запрос с веб-службой на сервер.

+0

Для чего это стоит, кто-то закатил общий браузер HTTP-каталогов на странице https://issues.apache.org/jira/browse/VFS-199. В моем случае веб-сервер должен следовать структуре каталогов, которую я указываю, поэтому мне нужно будет запустить соответствующую реализацию пути. Спасибо, что помогли мне понять, зачем нужна специальная реализация. – Gili

+0

Coolio - рад, что я мог бы помочь, и рад, что вы нашли этот проект. – jefflunt

+0

@normalocity Это почти не связано, и я просто снимаю это с вершины своего мозга, но я думаю, что в настоящее время в Java 7 нет метода, который вернул бы «Путь» для ресурса _classpath_, который был бы очень хороший. Что ты об этом думаешь? Я думаю, было бы хорошо, потому что «Путь» намного приятнее, чем «URL». –

0

Мне пришлось иметь дело с подобной проблемой и написал небольшой метод для решения этого вопроса, который вы можете найти ниже.

Он отлично подходит для конкатенации URL-адресов и относительных суффиксов. Будьте осторожны, чтобы не дать абсолютный абсолют из-за поведения функции разрешения URI.

private URI resolveURI(String root, String suffix) { 
    URI uri; 
    try { 
     uri = new URI(root + "/").resolve(suffix); 
    } catch (URISyntaxException e) { 
     //log 
    } 
    return uri; 
} 
Смежные вопросы