2013-08-22 3 views
0

java.awt.Desktop.getDesktop.open(someFile)을 사용하여 시스템 기본 응용 프로그램으로 파일을 열 수 있습니다. 그러나 해당 응용 프로그램에 출력이 있으면 콘솔에 표시됩니다. 커맨드 라인 유틸리티를 만들고 있기 때문에 이것은 불편하거나 불필요합니다. 표준 오류 스트림을 리디렉션 할 수있는 방법이 있습니까?java.awt.Desktop을 사용하여 stderr를 리디렉션하면서 파일 열기?

이 작업을 수행 할 수없는 경우 Desktop 파일을 여는 데 사용할 실행 파일의 경로를 찾는 방법은 무엇입니까? 해당 정보를 수집 한 후에는 Process/ProcessBuilder을 사용하면됩니다.

+0

전 프로가 아니지만, 데스크톱을 사용하여 새로운 프로세스를 시작하는 것은 고유 한 문제 일 수 있다고 생각합니다. –

+0

실제로'ProcessBuilder'를 사용하면 실행 파일의 경로가 필요 없습니다. Windows에서 작업하는 경우'new ProcessBuilder ("cmd.exe", "/ c", filepath) .start()'를 사용하면 cmd.exe가 기본 프로그램으로 파일을 엽니 다. Linux에서는 잘 모르겠지만,'new ProcessBuilder (filePath) .start()'만 사용하면 (지금 당장은 테스트 할 수 없다) 작동한다고 생각합니다. – dic19

+0

@ dic19 두번째 제안은'IOException' (permission denied)을 던집니다. 파일은 실행 가능하지 않습니다. 반드시 재부팅하고 싶지는 않기 때문에 Windows 솔루션에 대한 귀하의 말씀을 받아야 할 것입니다. 그것이 작동하더라도, 그것은 다른 플랫폼의 사람들을 돕지 않을 것입니다. – mattbdean

답변

1

ProcessBuilder을 사용하는 경우 기본적으로 파일을 여는 데 필요한 기본 프로그램 경로를 알 필요가 없습니다. 다음과 같이 (Xdg-open 참조) 리눅스에서 윈도우에 cmd.exexdg-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 배포판에 대한 좋은 소식, 당신은 그 OS에 대해 같은 명령을 사용할 수 있습니다 :) – dic19