是否可以通过java程序运行cmd

时间:2013-07-31 18:56:02

标签: java cmd

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

1 个答案:

答案 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();
    }

}