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 Ressource (z.B. Webseite) über deren Ort und das verwendete Protokoll identifiziert.
Hierbei können gültige File-Objekte natürlich nur von lokalen Ressourcen (Protokoll: 'file:)' erstellt werden.

Ausgangspunkt für die Erzeugung eines File-Objektes, wie auch eines lokalen URL, ist i.A. ein absoluter Pfad.
Bis Java 19 konnte durch Aufruf eines Konstruktors der Klasse URL durch Parametrisierung mit einem Pfad-String direkt ein URL-Objekt erzeugt werden. Dies war fehlerträchtig, da unzulässige Zeichen nicht konvertiert wurden. Ab Java 20 sind alle Konstruktoren der Klasse nun als deprecated gekennzeichnet und sollten somit nicht mehr verwendet werden.

String path = "/Test/datei neu.php";
URL url = new URL("file", null, path); // deprecated
System.out.println("URL: " + url); // URL: file:/Test/datei neu.php (Leerzeichen nicht erlaubt)

Die Erzeugung eines URL geschieht nun ausgehend von einem URI-Objekt, bei dessen Erzeugung Sonderzeichen ggf. kodiert werden. Dem überladenen Konstruktor werden im vorliegenden Fall das Protokoll, der Pfad und, hier nicht vorhanden, ein Fragment, etwa ein Sprungziel, übergeben. Bei Vorhandensein wird es, getrennt durch ein Doppelkreuz ('#') dem Pfad rechts angefügt.

URI uri = new URI("file", path, null);
System.out.println("URI: " + uri); // URI: file:/Test/datei%20neu.php (Leerzeichen kodiert)

In der Folge kann aus dem URI dann ein URL-Objekt gebildet werden.

URL url = uri.toURL();
System.out.println("URL: " + url); // URL: file:/Test/datei%20neu.php

Analog zur Methode toURL() der Klasse URI besitzt die Klasse URL auch eine Methode toURI(), über die ein URL auch wieder zurück in ein URI überführt werden kann.
Ein URI kann dann direkt zur Erzeugung eines File-Objektes herangezogen werden, da einer der vier File-Konstruktoren ein URI-Objekt als Parameter nutzen kann. Hierbei werden konvertierte Sonderzeichen wieder umgewandelt:

File file = new File(uri);
System.out.println("file: " + file); // file: /Test/datei neu.php

Lauffähiger 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) {
        final String path = "/Test/datei neu.php";
        File f = new File(path);
        URL url = file2URL(f);
        File file = url2File(url);
        System.out.println(url); // file:/Test/datei%20neu.php
        System.out.println(file); // /Test/datei neu.php
    }
    
    private static URL file2URL(File file) {
        URL url = null;
        String path = file.getAbsolutePath();
        try {
            URI uri = new URI("file", path, null);
            url = uri.toURL();
        } catch (URISyntaxException | MalformedURLException e) {
            e.printStackTrace();
        }
        return url;
    }
    
    private static File url2File(URL url) {
        File file = null;
        try {
            file = new File(url.toURI());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return file;
    }
}

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