可以通过java程序运行cmd吗
我想知道是否可以通过Java运行cmd。不仅仅是一次一个命令,而是一个连续的用户输入命令流,用于中继接收到的信息。这是可能的还是我应该现在就停止尝试 我不知道为什么我要附上这个;这不是很相关,但这正是我试图用它来完成的。但是,它会在每个命令后重置可以通过java程序运行cmd吗,java,cmd,Java,Cmd,我想知道是否可以通过Java运行cmd。不仅仅是一次一个命令,而是一个连续的用户输入命令流,用于中继接收到的信息。这是可能的还是我应该现在就停止尝试 我不知道为什么我要附上这个;这不是很相关,但这正是我试图用它来完成的。但是,它会在每个命令后重置cmd。(是的,我意识到这是一种糟糕的编码,但我只是在尝试一些老板问我的事情。) 基本上,cmd,但在带有用户输入命令的Java GUI后面是我的最终目标。如果有人能告诉我这是否可行,如果有人能为我指出正确的方向,我将不胜感激。是的,这是可能的 在我的答
cmd
。(是的,我意识到这是一种糟糕的编码,但我只是在尝试一些老板问我的事情。)
基本上,cmd
,但在带有用户输入命令的Java GUI后面是我的最终目标。如果有人能告诉我这是否可行,如果有人能为我指出正确的方向,我将不胜感激。是的,这是可能的
在我的答案的最后是一个示例程序。它远非完美,缺少一些实现细节。例如,正确的异常处理和检测cmd何时退出。。。但它可以作为一个起点
本质上,您的问题的解决方案是将cmd.exe作为一个新进程启动。然后从标准输入流(System.in)中读取java命令,并将其传输到cmd.exe-process。要向用户提供反馈,您必须读取cmd.exe-process的标准输出,并将其打印到java进程的标准输出(System.out)。还可以从cmd.exe-process读取标准错误,并将其打印到java进程的标准错误(System.err)
完成后关闭所有资源。我在示例中指出了这一点,但这还没有准备好生产。任何异常都会阻止示例程序清理
另一个实现细节:示例程序使用第二个线程读取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();
}
}
这样做:回答您的问题吗?另外,您可以使用
Desktop.getDesktop().open(新文件(“path/to/cmd”)代码>
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();
}
}