Java を使用してバット コマンドを実行します。バット操作に時間がかかりすぎると、ブロックの問題が発生する可能性があり、サーバーがシャットダウンするまでバットは実行されません。
のように:
次のようにコードをコピーします。
ランタイム 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;
java.io.BufferedReaderをインポートします。
インポート java.io.IOException;
java.io.InputStreamをインポートします。
インポートjava.io.InputStreamReader;
java.io.OutputStreamをインポートします。
java.io.PrintWriterをインポートします。
/**
* Runtime.getRuntime().exec によって生成されたエラー ストリームと出力ストリームを処理するために使用されます
*/
public class StreamGobbler extends Thread {
入力ストリームは;
文字列型。
出力ストリーム OS;
StreamGobbler(InputStream は String 型) {
this(is、type、null);
}
StreamGobbler(InputStream は、文字列型、OutputStream リダイレクト) {
this.is = です;
this.type = タイプ;
this.os = リダイレクト;
}
public void run() {
入力ストリームリーダー isr = null;
BufferedReader br = null;
PrintWriter pw = null;
試す {
if (os != null)
pw = 新しい PrintWriter(os);
isr = 新しいInputStreamReader(is);
br = 新しい BufferedReader(isr);
文字列 line=null;
while ( (line = br.readLine()) != null) {
if (pw != null)
pw.println(行);
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
キャッチ (IOException ioe) {
ioe.printStackTrace();
} ついに{
試す {
pw.close();
br.close();
isr.close();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}
}
バットを走らせてもブロックされません。