다음 코드를 고려하십시오.
String commandf = "ls /etc | grep release";
try {
// Execute the command and wait for it to complete
Process child = Runtime.getRuntime().exec(commandf);
child.waitFor();
// Print the first 16 bytes of its output
InputStream i = child.getInputStream();
byte[] b = new byte[16];
i.read(b, 0, b.length);
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
프로그램의 출력은 다음과 같습니다.
/etc:
adduser.co
물론 쉘에서 실행하면 예상대로 작동합니다.
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
인터넷은 파이프 동작이 크로스 플랫폼이 아니라는 사실 때문에 Java를 생산하는 Java 공장에서 일하는 똑똑한 사람들은 파이프가 작동한다고 보장 할 수 없다고 말합니다.
어떻게 할 수 있습니까?
나는 자바보다는 구축하여 내 분석을 모두 수행 않을거야 grep
그리고 sed
내가 언어를 변경하려는 경우, 나는 완전히 무 이동하지 그 언어, 내 구문 분석 코드를 다시 쓰기에 강제 할 것이기 때문에.
쉘 명령을 호출 할 때 Java가 파이핑 및 리디렉션을 수행하도록하려면 어떻게해야합니까?
command | grep foo
당신 과 같은 단순한 특정한 경우에는 command
자바에서 기본적으로 필터링을 실행 하고 수행하는 것이 훨씬 낫습니다 . 코드가 다소 복잡해 지지만 전체 리소스 소비와 공격 표면이 크게 줄어 듭니다.