¿Cómo abrir el editor preferido del sistema del usuario para el archivo dado?

Estoy intentando descubrir cómo abrir el editor preferido del sistema para un archivo determinado.

Digamos, tenemos un administrador de archivos, escrito en Java. El usuario va a la carpeta y ve la lista de archivos. Y, por ejemplo, hay un archivo Icon.jpg . El usuario hace doble clic en el nombre del archivo y el archivo se abre en el editor preferido del sistema (es decir, Gimp). El problema principal es: ¿cómo hacer eso?

Podemos hacer Runtime.getRuntime().exec("something file") , pero de esta manera usted debe saber qué progtwig es el preferido en el entorno del usuario. ¿Pero cómo?

También podemos hacer Desktop.getDesktop().edit(File file) , pero de esta manera no podemos rastrear el proceso y no podemos saber, entonces este proceso hijo está cerrado. Otro problema: la función no funciona en Linux (al menos en Ubuntu 8.10). También está Desktop.getDesktop().open(File file) , pero obliga a abrir el visor de archivos, en lugar del visor del sistema para ese tipo de archivo.

Estoy buscando una solución toda la semana, pero no tengo ninguna adecuada y genérica. ¿Conoces los otros enfoques a esta pregunta? Para mi proyecto, sería suficiente si funcionara en Windows + Linux + Mac.

Gracias por tus respuestas y consejos.

Editar en 2009-02-08 23:04

Otra sugerencia: ¿puedo forzar la ventana de “selección de aplicaciones” en Windows y en Linux, como en Mac con “abrir archivo”? Por ejemplo, luego de intentar abrir el archivo, ¿se le pide que elija la aplicación de la lista de sistemas preferidos? (algo así como “Abrir con …” en el explorador de Windows). ¿Tú sabes?

Parece que si no puede usar java.awt.Desktop , debe distinguir entre los sistemas operativos: Windows:

 RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL  

Linux:

 edit  

Mac:

 open  

HTH. Obviamente, eso no es muy portátil …

Mira el objeto java.awt.Desktop . En tu caso, quieres invocar edit()

Si quiere asegurarse de que una plataforma determinada admita esta llamada, puede hacer algo como lo siguiente (no he probado este código):

 public boolean editFile(final File file) { if (!Desktop.isDesktopSupported()) { return false; } Desktop desktop = Desktop.getDesktop(); if (!desktop.isSupported(Desktop.Action.EDIT)) { return false; } try { desktop.edit(file); } catch (IOException e) { // Log an error return false; } return true; } 

Esto no es multiplataforma, pero en Mac OS X puedes hacer

 Runtime.getRuntime().exec("open filename"); 

El ejecutable open(1) usa LaunchServices para elegir el progtwig correcto para ejecutar y luego lo usa para abrir el archivo llamado filename .

Esto funcionará en Windows

 Runtime.getRuntime().exec( "CMD /C START filename.ext " );