Abrir aplicación por defecto desde java

Esta es una de las típicas cosas que te vuelves un poco majareta buscándolas, pues la gente escribe mucho pero no esta probado.

El siguiente código lo he sacado googleando y lo he modificado y mejorado.

La función permite llamar a la aplicación por defeto que tenga un archivo asociado desde nuestro programa java.

Funciona en Linux(he probado en kubuntu), Windows, y en Mac.

A continuación se peude ver el código fuente.

    private void lanzarVisor(File archivo) {
        try {
            Process p = null;
            String osName = System.getProperty("os.name");
            try {
                if (osName.startsWith("Windows")) {
                    String[] command = {"cmd","/c","start",""visor"",""" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                } else if (osName.startsWith("Mac OS X")) {
                    String[] command = {"sh","-c","open "" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                } else { // es linux
                    String[] command = {"sh","-c","xdg-open "" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                }
            } catch (Exception e) {
                System.out.println("Please open a browser and go to "+ archivo.getAbsolutePath());
            }

            int exitCode = -1;
            if(p != null)
                exitCode = p.waitFor();
            if (exitCode != 0)
            {
                System.out.println("Nose puede abrir "" + archivo.getAbsolutePath() + """);
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(CDIPlannerView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Para probarlo se le puede llama de la siguientes maneras

lanzarVisor(new File("pepe.txt"));
lanzarVisor(new File("/home/pepeillo/imagenes/logo.jpg"));

Si lo que queremos es abrir una url tendríamos que modificar el método para que recoja un objeto String.