是的,有可能。
我回答的最后是一个示例程序。它远非完美,并且缺少一些实现细节。例如正确的异常处理以及检测 cmd 何时退出......但它可以用作起点。
本质上,您问题的解决方案是将 cmd.exe 作为新进程启动。然后从标准输入流 (System.in) 中读取 java 中的命令并将其通过管道传输到 cmd.exe 进程。要向用户提供反馈,您必须从 cmd.exe-process 读取标准输出并将其打印到 java 进程 (System.out) 的标准输出。还从 cmd.exe-process 读取标准错误并将其打印到您的 java 进程 (System.err) 的标准错误。
完成后关闭所有资源。我在示例中指出了这一点,但这还没有准备好生产。任何异常都会阻止示例程序清理。
另一个实现细节:示例程序使用第二个线程从 cmd.exe 进程读取输出。否则你只会在用户点击回车时得到输出。
最后,代码如下:
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();
}
}