2013-08-22 21 views
0

我可以使用java.awt.Desktop.getDesktop.open(someFile)打開一個帶有系統默認應用程序的文件。但是,如果該應用程序有任何輸出,它將顯示在控制檯中。由於我正在製作命令行實用程序,所以這很醜陋/不必要。有沒有辦法重定向它的標準錯誤流?使用java.awt.Desktop打開文件,同時重定向它的stderr?

如果不能這樣做,那麼如何找到Desktop用於打開文件的可執行文件的路徑?收集完這些信息後,使用Process/ProcessBuilder就足夠簡單了。

+0

我不是專業人士,但我*認爲*這可能是使用桌面啓動新過程的固有問題。 –

+0

實際上,如果您使用'ProcessBuilder',則不需要可執行文件的路徑。如果你在Windows上工作,你可以使用新的ProcessBuilder(「cmd.exe」,「/ c」,filepath).start(),然後'cmd.exe'將用默認程序打開文件。我不確定在Linux上,但我認爲如果你只使用'新的ProcessBuilder(filePath).start()'它會工作(我現在無法測試它)。 – dic19

+0

@ dic19第二個建議會拋出一個'IOException'(權限被拒絕)。這些文件不可執行。我將不得不接受Windows的解決方案,因爲我不一定要重新啓動。即使它確實有效,它也不會幫助其他平臺上的用戶。 – mattbdean

回答

1

原則上,如果您使用ProcessBuilder,則無需知道默認程序打開文件的路徑。您可以通過cmd.exe在Windows和xdg-open在Linux上這個任務交給操作系統(見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方法,因爲它只是一個例子

免責聲明:正如我在我的評論中所說,這是一個醜陋的/有限的解決方法,這件事情,但它的作品。

+1

我讀過,大多數Mac發行版也有'xdg-open'。 – mattbdean

+0

謝謝你的幫助:) – mattbdean

+0

你很好!關於Mac發行版的好消息,您可以使用該操作系統的相同命令:) – dic19

相關問題