Java를 사용하여 bat 명령을 실행합니다. bat 작업이 너무 오래 걸리면 차단 문제가 발생할 수 있으며 서버가 종료될 때까지 bat이 실행되지 않습니다.
좋다:
다음과 같이 코드 코드를 복사합니다.
런타임 r=Runtime.getRuntime();
프로세스 p=null;
노력하다{
문자열 경로 = "D:/test.bat";
p = r.exec("cmd.exe /c "+경로);
p.waitFor();
}catch(예외 e){
System.out.println("실행 오류:"+e.getMessage());
e.printStackTrace();
}
일반적으로 Java의 exec는 스레드 차단 문제를 처리하는 데 도움이 되지 않으며 수동으로 처리해야 합니다.
처리 후:
다음과 같이 코드 코드를 복사합니다.
런타임 r=Runtime.getRuntime();
프로세스 p=null;
노력하다{
문자열 경로 = "D:/test.bat";
p = r.exec("cmd.exe /c "+경로);
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
errorGobbler.start();
StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");
outGobbler.start();
p.waitFor();
}catch(예외 e){
System.out.println("실행 오류:"+e.getMessage());
e.printStackTrace();
}
StreamGobbler 클래스는 다음과 같습니다:
다음과 같이 코드 코드를 복사합니다.
패키지 com.test.tool;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* Runtime.getRuntime().exec에 의해 생성된 오류 스트림 및 출력 스트림을 처리하는 데 사용됩니다.
*/
공개 클래스 StreamGobbler는 Thread {를 확장합니다.
입력스트림은;
문자열 유형;
출력스트림 os;
StreamGobbler(InputStream은 문자열 유형) {
this(is, 유형, null);
}
StreamGobbler(InputStream은 문자열 유형, OutputStream 리디렉션) {
this.is = is;
this.type = 유형;
this.os = 리디렉션;
}
공개 무효 실행() {
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter 비밀번호 = null;
노력하다 {
if (os != null)
pw = 새로운 PrintWriter(os);
isr = 새로운 InputStreamReader(is);
br = 새로운 BufferedReader(isr);
문자열 라인=null;
while ( (line = br.readLine()) != null) {
if (비밀번호 != null)
pw.println(라인);
System.out.println(유형 + ">" + 줄);
}
if (비밀번호 != null)
pw.flush();
} 잡기(IOException ioe) {
ioe.printStackTrace();
} 마지막으로{
노력하다 {
pw.close();
br.닫기();
isr.close();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
}
배트를 실행하면 차단되지 않습니다.