使用java.awt.Desktop打开文件,同时重定向它的stderr?

时间:2013-08-22 21:11:37

标签: java awt desktop stderr

我可以使用java.awt.Desktop.getDesktop.open(someFile)使用系统默认应用程序打开文件。但是,如果该应用程序有任何输出,它将显示在控制台中。由于我正在制作命令行实用程序,因此这很难/不必要。有没有办法重定向它的标准错误流?

如果无法做到这一点,那么找到Desktop用于打开文件的可执行文件的路径呢?收集该信息后,使用Process / ProcessBuilder

就足够简单了

1 个答案:

答案 0 :(得分:1)

原则上,如果您使用ProcessBuilder,则无需知道打开文件的默认程序的路径。您可以通过Windows上的cmd.exe和Linux上的xdg-open将此任务委派给操作系统(请参阅Xdg-open),如下所示:

public static void main(String[] args) {   
    String filePath = args[0];        
    String operatingSystem = System.getProperty("os.name");
    try{
        if(operatingSystem.toLowerCase().contains("windows")){
            ProcessBuilder pb = new ProcessBuilder("cmd.exe","/c",filePath);                
            Process p = pb.start();                

        } else if (operatingSystem.toLowerCase().contains("linux")){                
            ProcessBuilder pb = new ProcessBuilder("xdg-open",filePath);
            Process p = pb.start();

        } else {
            throw new UnsupportedOperationException(String.format("Not supported for %1$1s", operatingSystem));
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

注意:我没有使用ProcessBuilder#redirectError方法,因为它只是一个例子。

免责声明:正如我在评论中所说,这是一个丑陋/有限的解决方法,但它确实有效。