2016-12-20 3 views
2

로/ERR을 폐기하기 : Windows에서플랫폼에 독립적 인 방법은 당신이 가진 프로세스의 출력을 폐기 할 수 유닉스 ProcessBuilder를

pb.redirectOutput(new File("/dev/null")); 

동안 당신이 대신 NUL를 사용해야합니다. 임의의 플랫폼을 지원하기위한 다음 스 니펫보다 더 좋은 옵션이 있습니까?

File devNull = new File("/dev/null"); 
if (devNull.exists()) { 
    pb.redirectOutput(devNull); 
} else { 
    pb.redirectOutput(new File("NUL")); 
} 

이것은 미봉책 보이지만, 사용하는 ProcessBuilder.Redirect.NULL 필드 또는 겉으로 API에서이 작업을 수행하는 다른 방법이 없습니다.

나는 유닉스가 아닌 비 Windows의 경우를 처리하지 않는다는 것에 약간의 걱정이있다. (그런 경우는 있을지 모르겠다.)

저는 platform-independent /dev/null output sink for Java과 비슷한 질문을 알고 있지만 no-op를 사용하면 OutputStream은 여전히 ​​스레드를 회전시켜야 출력을 능동적으로 폐기 할 수 있습니다. OS가 나를 대신하도록 허용하고 싶습니다.

+0

이 주제에 대한 다른 모든 스택 오버플로 스레드를 읽은 후에도 동일한 작업을 수행했습니다. 나는 이것이 적절한 해결책이라고 생각한다. –

답변

0

파이썬의 subprocess 모듈의 동작으로 판단 할 때 문제의 코드 스 니펫으로 충분할 수 있습니다. subprocess.DEVNULL uses os.devnull이고, 차례로 comes from os.path이 있으며 (nul) 또는 posixpath (/dev/null)으로 정의됩니다.

이들은 파이썬이 지원하는 유일한 경로 인 것처럼 보입니다. 비슷하게 적절하게 nul 또는 /dev/null을 사용하여 Java에서 충분해야합니다. Java를위한보다 세련되고 플랫폼 독립적 인 옵션이있을 수 있지만, 그렇다면 찾지 못했습니다.