0

我想知道是否可以通过 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 后面是我的最终游戏。如果有人能告诉我这是否可能,如果可以,请指出我正确的方向,我将不胜感激。

4

1 回答 1

0

是的,有可能。

我回答的最后是一个示例程序。它远非完美,并且缺少一些实现细节。例如正确的异常处理以及检测 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();
    }

}
于 2013-07-31T20:15:41.900 回答