はい、可能です。
私の答えの最後にサンプルプログラムがあります。完璧にはほど遠いもので、実装の詳細がいくつか欠けています。たとえば、適切な例外処理や、cmd が終了したタイミングの検出などです。ただし、開始点として使用することもできます。
本質的に、質問に対する解決策は、cmd.exe を新しいプロセスとして開始することです。次に、標準入力ストリーム (System.in) から Java のコマンドを読み取り、それを cmd.exe プロセスにパイプします。ユーザーにフィードバックを提供するには、cmd.exe-process から標準出力を読み取り、それを Java プロセスの標準出力 (System.out) に出力する必要があります。また、cmd.exe-process から標準エラーを読み取り、Java プロセス (System.err) の標準エラーに出力します。
完了したら、すべてのリソースを閉じます。例でこれを示しましたが、これは本番環境に対応していません。例外があると、サンプル プログラムのクリーンアップが妨げられます。
別の実装の詳細: サンプル プログラムでは、2 番目のスレッドを使用して cmd.exe-process からの出力を読み取ります。そうしないと、ユーザーが Enter キーを押したときにのみ出力が得られます。
最後に、コードは次のとおりです。
package com.example;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class JavaCmd {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ProcessBuilder procBuilder = new ProcessBuilder("cmd.exe");
Process proc = procBuilder.start();
PrintWriter outToProc = new PrintWriter(proc.getOutputStream());
final BufferedReader inFromProc = new BufferedReader(new InputStreamReader(proc.getInputStream()));
final BufferedReader errorFromProc = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Thread outputThread = new Thread(new Runnable(){
@Override
public void run() {
while(true) {
try {
while(inFromProc.ready()) {
String line = inFromProc.readLine();
System.out.println(line);
}
while(errorFromProc.ready()) {
String line = errorFromProc.readLine();
System.err.println(line);
}
} catch (IOException e) {
throw new RuntimeException("Error in output thread", e);
}
try {
Thread.sleep(100);
} catch(InterruptedException e) {
System.out.println("Output Thread interrupted -> Thread will terminate");
break;
}
}
}
});
outputThread.start();
System.out.println("\n\nProxy shell is ready. Enter 'quit' to leave program.\n\n");
System.out.flush();
String line = null;
while((line = reader.readLine()) != null) {
if(line.equalsIgnoreCase("quit")) {
System.out.println("Good Bye");
break;
}
outToProc.println(line);
outToProc.flush();
}
reader.close();
outputThread.interrupt();
proc.destroy();
}
}