Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以通过java程序运行cmd吗_Java_Cmd - Fatal编程技术网

可以通过java程序运行cmd吗

可以通过java程序运行cmd吗,java,cmd,Java,Cmd,我想知道是否可以通过Java运行cmd。不仅仅是一次一个命令,而是一个连续的用户输入命令流,用于中继接收到的信息。这是可能的还是我应该现在就停止尝试 我不知道为什么我要附上这个;这不是很相关,但这正是我试图用它来完成的。但是,它会在每个命令后重置cmd。(是的,我意识到这是一种糟糕的编码,但我只是在尝试一些老板问我的事情。) 基本上,cmd,但在带有用户输入命令的Java GUI后面是我的最终目标。如果有人能告诉我这是否可行,如果有人能为我指出正确的方向,我将不胜感激。是的,这是可能的 在我的答

我想知道是否可以通过Java运行cmd。不仅仅是一次一个命令,而是一个连续的用户输入命令流,用于中继接收到的信息。这是可能的还是我应该现在就停止尝试

我不知道为什么我要附上这个;这不是很相关,但这正是我试图用它来完成的。但是,它会在每个命令后重置
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();
    }

}