この SyncPipe Runnable を介して System.out に出力する cmd アプリケーションを開始します。
public class SyncPipe implements Runnable {
private final InputStream is;
private final OutputStream os;
public SyncPipe(InputStream is, OutputStream os) {
this.is = is;
this.os = os;
}
public void run() {
try {
final byte[] buffer = new byte[1024];
for ( int length = 0; ( length = is.read(buffer) ) != -1; )
os.write(buffer, 0, length);
System.out.print("stopped");
} catch ( Exception ex ) {
ex.printStackTrace();
}
}
}
私はRunItを開始しますcmd = "C:/bin/read.exe -f D:/test.jpg"
private class RunIt implements Runnable {
public int p;
public String cmd;
public RunIt (int p, String cmd) {
this.p = p;
this.cmd = cmd;
}
public void run() {
ProcessBuilder pb = new ProcessBuilder("cmd");
try {
process = pb.start();
(new Thread(new SyncPipe(process.getErrorStream(), System.err))).start();
(new Thread(new SyncPipe(process.getInputStream(), System.out))).start();
OutputStream out = process.getOutputStream();
out.write((cmd + "\r\n").getBytes());
out.flush();
out.close();
try {
process.waitFor();
} catch ( InterruptedException e ) {
e.printStackTrace();
}
println("Stopped using %d.", p);
} catch ( IOException ex ) {
ex.printStackTrace();
}
}
}
私の質問:どうすれば(new Thread(new SyncPipe(process.getErrorStream(), System.err)))
死ぬことができますか?SyncPipe にブール変数を与え、実行時stop
に設定しtrue
、経由でチェックしてもうまくいきfor ( int length = 0; ( length = is.read(buffer) ) != -1 && !stop; )
ませんでした。
よろしくお願いします。
@Grayが提案した回避策を実行することになりました。それは今動作します:
public void run() {
try {
final byte[] buffer = new byte[1024];
do
if ( is.available() > 0 ) {
int length = is.read(buffer);
if ( length != -1 )
os.write(buffer, 0, length);
else
stop = true;
}
while ( !stop );
} catch ( Exception ex ) {
ex.printStackTrace();
}
}