2010-06-28 2 views
5

프로그램에서 명령을 실행해야합니다. 커맨드 라인은 괜찮습니다, 터미널에서 해봤지만 프로그램에서는 작동하지 않습니다.Runtime.getRuntime().과의 리디렉션 exec()가 작동하지 않습니다.

내 코드에서 사본을 추가

File dir = new File("videos"); 
    String[] children = dir.list(); 
    if (children == null) { 
    // Either dir does not exist or is not a directory 
    System.out.print("No existe el directorio\n"); 
    } else { 
    for (int i=0; i<children.length; i++) { 
    // Get filename of file or directory 
    String filename = children[i]; 

    //Recojo el momento exacto 
    System.out.print("\n" +filename); 

    Process p = Runtime.getRuntime().exec("exiftool -a -u -g1 -j videos/"+filename+">metadata/"+filename+".json"); 
    } 

폴더 (파일 이름)에있는 모든 파일의 이름을 얻을하고 .json에 그들을을 writting, theese 비디오의 메타 데이터를 추출해야합니다 프로그램 파일을 '메타 데이터'폴더에 저장하십시오.
어디에 문제가 있습니까?

+1

그건 그렇고 - "작동하지 않는다"는 말을 피하십시오. 이것은 아무에게도 계속 진행할 정보를주지는 않습니다 (이 경우에는 효과가 있음). 대신, 당신은 뭔가 잘못되었다고 생각하게 만든 출력/오류 메시지를 제공해야합니다. 필요하다면 당신이 * 기대 *하고, 실제로 어떤 일이 일어 났는지도 명확히해야합니다 (그들이 다른 위치를 강조 표시). –

답변

12

문제는 리디렉션 문자 (>)가 쉘 기반 구조이고 이 아니고 실행 파일입니다. 그래서 당신이 bash 같은 것을 통해이 명령을 실행하지 않는다면 (그것은 당신이 아닙니다), 여러분의 exiftool 호출에 대한 문자 적 ​​문자 인수로 해석 될 것입니다. - bash -c에 대한 인수로 전체 명령 줄을 통과

  1. 것은 그것을 할 수 떠들썩한 파티를 얻을 : 당신이 작업이 얻고 싶은 경우에

    , 당신은 두 가지 옵션이 있습니다. 당신의 경우에는 괜찮아 보이지만 약간의 영웅적 탈출이 필요할 수 있습니다.

  2. Java에서 리디렉션을 직접 수행하십시오. 리디렉션 된 출력 (즉, >까지의 모든 기호)없이 명령을 호출 한 다음 프로세스의 outputstream에서 읽고 모든 내용을 해당 파일에 기록하십시오.

후자의 접근 방식은 그 꼭대기에 실제로 아주 약간의 여분의, 초기에 더 많은 작업처럼 들리 겠지만, 당신은 당신이 필요가 항상 프로세스의 출력을 읽을 것을 고려할 때 어쨌든합니다 (javadocs, 두 번째 단락 참조) . 이 출력을 던지기보다는 파일로 보내기 만하면됩니다.

Process p = new ProcessBuilder() 
    .command("exiftool", "-a", "-u", "-g1", "-j", 
      new File("videos", filename).toString()) 
    .redirectOutput(new File("metadata", filename + ".json")) 
    .start(); 

이 아래에 "솔루션 2"폭포하지만 런타임 라이브러리는 보일러를 돌봐 : 당신이 자바 7이있는 경우

+3

'Runtime.exec' 관련 문제에 대한 일반적인 언급으로 나는 고대의, 그러나 여전히 적절한 기사 [Runtime.exec()가 안되면]을 제안한다. (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

관련 문제