0

Java を介して cmd を実行できるかどうかを知りたいです。一度に 1 つのコマンドだけでなく、受信した情報を中継するユーザー入力コマンドの連続ストリーム。これは可能ですか、それとも今すぐやめるべきですか?

これを添付する理由がわかりません。あまり関係ありませんが、これは私がこれを達成しようとしていたものです。ただし、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) の標準エラーに出力します。

完了したら、すべてのリソースを閉じます。例でこれを示しましたが、これは本番環境に対応していません。例外があると、サンプル プログラムのクリーンアップが妨げられます。

別の実装の詳細: サンプル プログラムでは、2 番目のスレッドを使用して 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();
    }

}
于 2013-07-31T20:15:41.900 に答える