Wie kann ein File-Objekt zu einem URL gewandelt werden und umgekehrt?

Ein URL (Uniform Resource Locator) ist eine Unterart eines URI (Uniform Resource Identifier), der eine über ein Netzwerkprotokoll erreichbare Resource (z.B. Webseite) über den Ort und das verwendete Protokoll identifiziert.
Gültige File-Objekte können nur von lokalen Resourcen (Protokoll: ' file://)' erstellt werden.

Auf den ersten Blick stellen die Klassen File, URI und URL ausreichend Methoden bereit, um Konvertierungen vom einen Objekt in ein anderes vorzunehmen. Das Problem liegt jedoch in deren Verhalten, bzw. dem Konvertierungsumfang.
Die Methode fileToURL(File file) nimmt ein File-Objekt entgegen, aus dessen Pfad, versehen mit dem Protokoll-Präfix file:// ein URL-Objekt gebildet wird. Dies funktioniert bei einfachen Pfaden recht gut, versagt jedoch bei nicht URL-konformen Sonderzeichen. So werden Leerzeichen z.B. nicht konvertiert. Um dies zu erreichen bietet es sich an, das File-Objekt zunächst in ein URI-Objekt und anschließend von dort in ein URL-Objekt zu casten.

    static URL fileToURL(File file){
        URL url = null;
        try {
            url = new URL("file://" + file.getPath());
            // Sonderzeichen (z.B. Leerzeichen) bleiben erhalten
            System.out.println(url);
            // Sonderzeichen (z.B. Leerzeichen) werden codiert
            url = file.toURI().toURL();
            System.out.println(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return url;
    }

Den umgekehrten Weg nimmt die Methode urlToFile(URL url). Der URL wird zunächst in einen URI gewandelt, der als Argument für die Bildung eines File-Objektes herangezogen wird. Hier taucht jedoch das gegenteilige Problem von oben auf: z.B. URL mit Leerzeichen können nicht konvertiert werden, sodass in diesen Fällen innerhalb der catch-Klausel auf den Pfadanteil der URL zurückgegriffen wird.

    static File urlToFile(URL url) {
        File file = null;
        try {
          file = new File(url.toURI());
        } catch(URISyntaxException e) {
          file = new File(url.getPath());
        }
        System.out.println(file);
        return file;
    }

gesamter Quelltext:

import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

public class URLToFile {

    public static void main(String[] args) {
        URL url;
        try {
            url = new URL("file:///Users/joecze/sites/javabeginners/index.php");
            File file = urlToFile(url);
            fileToURL(file);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    static File urlToFile(URL url) {
        File file = null;
        try {
          file = new File(url.toURI());
        } catch(URISyntaxException e) {
          file = new File(url.getPath());
        }
        System.out.println(file);
        return file;
    }

    static URL fileToURL(File file){
        URL url = null;
        try {
            url = new URL("file://" + file.getPath());
            System.out.println(url);
            url = file.toURI().toURL();
            System.out.println(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return url;
    }
}

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.