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

标签 java awt desktop stderr

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

如果无法完成此操作,如何查找 Desktop 用于打开文件的可执行文件的路径?收集这些信息后,使用 Process/ProcessBuilder 就足够简单了。

最佳答案

原则上,如果您使用ProcessBuilder,则无需知道打开文件的默认程序的路径。您可以通过 Windows 上的 cmd.exe 和 Linux 上的 xdg-open 将此任务委托(delegate)给操作系统(请参阅 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 方法,因为它只是一个示例。

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

关于java - 使用 java.awt.Desktop 打开文件,同时重定向它的 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390912/

相关文章:

java - 创建顶部和底部有点的六边形

Java 正则表达式在关闭标记后添加空格(如果不存在)

调整窗口大小时 Java AWT 小程序白屏

java Swing 。如何等待其他 Jframes

android - OpenCV MSER 实现为 android 和桌面版本产生不同的结果

javascript - 使用 JavaScript/HTML/CSS 开发 OSX 应用程序

ruby - 使用文本 IO 双击可执行文件制作 ruby​​ 脚本?

java - 从 Eclipse 启动 wildfly-swarm "org.jboss.modules.ModuleLoadException"

java - 调整我的进度条的大小

java - 去除字符串中的重复字符