Öffnen beliebiger Dokumente aus Java-Anwendungen heraus
Heutzutage sind die Anwender jedes Betriebssystems daran gewöhnt, sich nicht mehr merken (oder nicht herausfinden) zu müssen, mit welcher Anwendung man ein bestimmtes Dateiformat öffnet - Doppelklick reicht aus. Kann man diesen Mechanismus auch in Java-Programmen verwenden?
Betriebssysteme
Man kann diesen Mechanismus zumindest in Java-Programmen nachstellen - mit geringem Aufwand sogar. Dazu muss zunächst eine Identifizierung des Betriebssystems stattfinden:
String osName = System.getProperty("os.name");
Abhängig vom Betriebssystem ist die Vorgehensweise, um eine Datei mit dem jeweils voreingestellten Betrachter zu öffnen, eine andere.
MacOS
Die Java-Laufzeitumgebung für MacOS verfügt über eine Klasse namens com.apple.eio.FileManager, deren Methode man eine URL übergibt. Diese öffnet dann die im Betriebssystem konfigurierte zuständige Anwendung:
Class fileMgr = Class.forName("com.apple.eio.FileManager");
Method openURL = fileMgr.getDeclaredMethod("openURL",new Class[]{String.class});
openURL.invoke(null, new Object[]{"someName"});
Windows
Unter Windows existiert eine solche Spezielklasse nicht. Statt dessen kann man hier das Programm rundll32 mit einer entsprechenden Kommandozeile benutzen:
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "someName");
Linux
Linux nun gibt sich als aufwendigstes der drei Betriebssysteme, wenn es um das Öffnen von Dateien mit dem jeweils eingestellten "Lieblings"-Programm geht. Das ist sicher auch darin begründet, dass jeder Fenstermanager so seine eigenen Ideen zur Verwaltung solcher Verknüpfungen hat. Aber auch unter Linux ist das Ziel erreichbar:
Man stellt einfach eine Liste mit möglichen Programmen zusammen, die das gewünschte Format öffnen können. Am Anfang der Liste sollten Allroundkönner stehen, wie etwa das der Window-Mimik rundll32 ähnelnde "gnome-open" oder auch der Browser Mozilla, der die Dateien seinen installierten Plugins übergeben könnte.
String[] apps = {"gnome-open", "firefox", "..."};
Anschließend testet man, welche der Alternativen wirklich installiert ist:
String app = null;
for (int count = 0; count < apps.length && app == null; count++)
{
if (Runtime.getRuntime().exec(new String[]{"which", apps[count]}).waitFor() == 0)
{
app = apps[count];
}
}
Wurde eine der Alternativen gefunden, wird diese mit dem Namen der Datei aufgerufen:
if (app == null)
{
throw new Exception("Could not find suitable application");
}
else
{
Runtime.getRuntime().exec(new String[]{app, "someName"});
}

