Wie kann ein File-Objekt zu einem URL gewandelt werden und umgekehrt?
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;
}
}