Подтвердить что ты не робот

Преобразование файла Java://URL-адрес в файл (...), независимый от платформы, включая пути UNC

Я разрабатываю независимое от платформы приложение. Я получаю URL-адрес файла *. В окнах это:

  • file:///Z:/folder%20to%20file/file.txt

  • file://host/folder%20to%20file/file.txt (путь UNC)

Я использую new File(URI(urlOfDocument).getPath()), который отлично работает с первым, а также в Unix, Linux, OS X, но не работает с UNC-путями.

Каков стандартный способ конвертировать файлы: URL-адреса в файлы (..), совместимые с Java 6?

......

* Примечание. Я получаю тезисы URL из OpenOffice/LibreOffice (XModel.getURL()).

4b9b3361

Ответ 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 работает следующий метод:

  1. Сформировать URI из строки файла URI
  2. Создать файл из 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();