Drucken

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