it-swarm.com.de

Konvertieren von Java-Datei: // URL in Dateipfad (...), plattformunabhängig, einschließlich UNC-Pfaden

Ich entwickle eine plattformunabhängige Anwendung. Ich erhalte eine Datei-URL * . Unter Windows sind dies:

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

  • file://Host/folder%20to%20file/file.txt (ein UNC-Pfad)

Ich benutze new File(URI(urlOfDocument).getPath())which gut mit dem ersten und auch unter Unix, Linux, OS X, aber nicht mit UNC-Pfaden.

Was ist die Standardmethode zum Konvertieren von Dateien: URLs in Dateipfade (..), die mit Java 6 kompatibel sind?

......

* Hinweis: Ich erhalte diese URLs von OpenOffice/LibreOffice (XModel.getURL ()).

20
Christian Fries

Basierend auf dem in der Antwort von Simone Giannis angegebenen Hinweis und Link ist dies mein hack , um dies zu beheben.

Ich teste auf uri.getAuthority (), da der UNC-Pfad eine Behörde meldet. Dies ist ein Fehler - also verlasse ich mich auf die Existenz eines Fehlers, der böse ist, aber es scheint, als würde er für immer bestehen bleiben (da Java 7 das Problem in Java.nio.Paths löst).

Hinweis: In meinem Kontext erhalte ich absolute Pfade. Ich habe dies unter Windows und OS X getestet.

(Noch auf der Suche nach einem besseren Weg, um es zu tun)

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("____________________________________________________________");
    }

}
9
Christian Fries

Aufbauend auf dem Kommentar von @ SotiriosDelimanolis, hier eine Methode zum Umgang mit URLs (z. B. Datei: ...) und Nicht-URLs (z. B. C: ...) unter Verwendung von 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);
    }
}
2
Markus Pscheidt

Java (mindestens 5 und 6, Java 7-Pfade am häufigsten gelöst) hat ein Problem mit UNC und URI. Das Eclipse-Team hat es hier zusammengefasst: http://wiki.Eclipse.org/Eclipse/UNC_Paths

In Java.io.File-Javadocs lautet das UNC-Präfix "////" und Java.net.URI verarbeitet file: //// Host/Pfad (vier Schrägstriche).

Weitere Details zu den Ursachen und möglichen Problemen, die bei anderen URI- und URL-Methoden auftreten, finden Sie in der Liste der Fehler am Ende des oben angegebenen Links.

Aus diesen Informationen heraus entwickelte das Eclipse-Team die Klasse org.Eclipse.core.runtime.URIUtil, deren Quellcode beim Umgang mit UNC-Pfaden wahrscheinlich helfen kann.

1
Simone Gianni

Für Java 8 funktioniert die folgende Methode:

  1. Bilden Sie einen URI aus einer Datei-URI-Zeichenfolge
  2. Erstellen Sie eine Datei aus dem URI (nicht direkt aus dem URI-String, der absolute URI-String sind keine Pfade)

Siehe Code-Snippet

    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();
0
Ironluca