我想知道是否可以通过Java运行cmd 。不只是一次一个命令,而是一个连续的用户输入命令流,用于中继收到的信息。这可能还是我现在应该停止尝试?
我不知道为什么我要附上这个;它不是很相关,但这正是我试图用它来实现的。但是,它会在每个命令后重置cmd
。 (是的,我意识到这是错误的编码,但我只是想尝试一下老板问的问题。)
import java.io.*;
import java.util.Scanner;
public class Cmd {
public static void main(String[] args) throws IOException {
String line;
while (true) {
Scanner scanner = new Scanner(System.in);
String comm = scanner.nextLine();
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", comm);
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
while (true) {
line = r.readLine();
if(line==null){break;}
System.out.println(line);
}
}
}
}
基本上,cmd
但是在带有用户输入命令的Java GUI后面是我的最终游戏。如果有人能告诉我这是否可能,如果有的话,请指出我正确的方向,我将不胜感激。
答案 0 :(得分:0)
是的,这是可能的。
在我的回答结束时是一个示例程序。它远非完美,缺少一些实现细节。例如正确的异常处理,并且还检测cmd何时退出...但它可以用作起点。
本质上,您的问题的解决方案是将cmd.exe作为新进程启动。然后从标准输入流(System.in)中读取java中的命令并将其传递给cmd.exe进程。要向用户提供反馈,您必须从cmd.exe-process读取标准输出并将其打印到Java进程的标准输出(System.out)。还要从cmd.exe-process读取标准错误并将其打印到java进程的标准错误(System.err)。
完成后关闭所有资源。我在示例中指出了这一点,但这不是生产准备。任何异常都会阻止示例程序清理。
另一个实现细节:示例程序使用第二个线程来读取cmd.exe-process的输出。否则,只有当用户点击进入时才会输出。
最后,这是代码:
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();
}
}