複数のコマンドを実装する方法の解決策を見つけようとしています-Windows cmdシェルとの応答相互作用。例:
- コマンド シェルを起動する
- 「ディレクトリ」
- 入力を待って処理する
- 入力内容に応じて新たなコマンドを実行
- 入力を待って処理する
- 等
ご注意ください!上記の手順は、通信方法を説明するためだけのものでした。ファイル システムをブラウズするつもりはありません。つまり、実際のコマンドは別のものである可能性があります。
これまでのアプローチ:
try {
Runtime rt = Runtime.getRuntime();
p = rt.exec("cmd");
error = p.getErrorStream();
input = p.getInputStream();
output = new PrintStream(p.getOutputStream());
StreamGobbler errGobbler = new StreamGobbler(error, "ERROR");
StreamGobbler inGobbler = new StreamGobbler(input, "INPUT");
errGobbler.start();
inGobbler.start();
output.println("dir");
output.flush();
sleep(5);
output.println("dir");
output.flush();
} catch (IOException e) {
System.out.println(e.printStackTrace());
}
StreamGobbler クラス:
class StreamGobbler extends Thread
{
InputStream is;
String type;
ArrayList<String> cmdRespArr = new ArrayList<String>();
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bf = new BufferedReader(isr);
String line = null;
while ( ( line = bf.readLine() ) != null ) {
cmdRespArr.add(line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
ただし、この例では、run メソッドの while ループは、発行されたコマンド間で戻ることはありません (これは問題の一部ではありません)。
したがって、アプローチは、while メソッドがコレクションまたは他のコンテナーに読み取られた行を追加し、cmd シェルが入力の準備ができていることを示す何かを監視することです (これは、以前からのすべての利用可能な入力を示します)。コマンドが読み込まれました)。そして、次のコマンドを発射しますか?
上記の例では、この指示により、現在デバッグ目的でのみ存在するスリープ コールが取り除かれます。
Pythonでやったときのアプローチがこれだったという漠然とした記憶があります。
それとも、これは完全に間違っていますか?