Запустите интерактивную программу Dos из Java - PullRequest
0 голосов
/ 09 января 2012

Я хотел бы запустить программу Dos с веб-сервера. Программа Dos должна запускаться в интерактивном режиме, поскольку пользовательский интерфейс представляет собой серию вопросов и ответов. Ответ на один вопрос определит следующий вопрос. Мне придется использовать ajax на веб-сервере, но я думаю, что смогу это сделать.

Я нашел одну программу Java в Stackoverflow, которая, кажется, делает что-то похожее на то, что я хочу. Однако, когда я компилирую программу, я получаю сообщение об ошибке, т.е.

javac PipeRedirection.java 
PipeRedirection.java:43: package InputProcess does not exist
                    InputProcess.Gobbler outGobbler = new InputProcess.Gobbler(p.getInputStream());

URL вопроса переполнения стека был

Как я могу записать большой вывод в Process getOutputStream?

Файл Java был

/* 
 ####### PipeRedirection.java 
*/

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class PipeRedirection {

public static void main(String[] args) throws FileNotFoundException {

    if(args.length < 2) {
            System.err.println("Need at least two arguments");
            System.exit(1);
    }

    try {
            String input = null;
            for(int i = 0; i < args.length; i++) {

                    String[] commandList = args[i].split(" ");

                    ProcessBuilder pb = new ProcessBuilder(commandList);
                    //pb.redirectErrorStream(true);
                    Process p = pb.start();

                    if(input != null) {
                            PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
                            writer.println(input);
                            writer.flush();
                            writer.close();
                    }

                    InputProcess.Gobbler outGobbler = new InputProcess.Gobbler(p.getInputStream());
                    InputProcess.Gobbler errGobbler = new InputProcess.Gobbler(p.getErrorStream());
                    Thread outThread = new Thread(outGobbler);
                    Thread errThread = new Thread(errGobbler);
                    outThread.start();
                    errThread.start();

                    outThread.join();
                    errThread.join();

                    int exitVal = p.waitFor();
                    System.out.println("\n****************************");
                    System.out.println("Command: " + args[i]);
                    System.out.println("Exit Value = " + exitVal);
                    List<String> output = outGobbler.getOuput();
                    input = "";
                    for(String o: output) {
                            input += o;
                    }
            }
            System.out.println("Final Output:");
            System.out.println(input);

    } catch (IOException ioe) {
            // TODO Auto-generated catch block
            System.err.println(ioe.getLocalizedMessage());
            ioe.printStackTrace();
    } catch (InterruptedException ie) {
            // TODO Auto-generated catch block
            System.err.println(ie.getLocalizedMessage());
            ie.printStackTrace();
    }

}


public static class Gobbler implements Runnable {
    private BufferedReader reader;
    private List<String> output;

    public Gobbler(InputStream inputStream) {
            this.reader = new BufferedReader(new InputStreamReader(inputStream));
    }

    public void run() {
            String line;
            this.output = new ArrayList<String>();
            try {
                    while((line = this.reader.readLine()) != null) {
                            this.output.add(line + "\n");
                    }
                    this.reader.close();
            }
            catch (IOException e) {
                    // TODO
                    System.err.println("ERROR: " + e.getMessage());
            }
    }

    public List<String> getOuput() {
            return this.output;
    }
}
}

Кто-нибудь знает, почему я получаю ошибку компиляции? Могу ли я заменить другой код для InputProcess?

Спасибо за любую помощь

Peter

1 Ответ

1 голос
/ 09 января 2012

Я думаю, совершенно очевидно, что вам не хватает частей в этом коде. Пакет с именем InputProcess, имеющий класс Gobbler, не был включен в сообщение ОП. Возможно, потому что это не имело отношения к их вопросу.

Сообщение об ошибке по существу говорит, что он не может найти этот пакет / код, который ищет.

Что именно делает этот класс, может сказать только ОП. Тем не менее, по своей сути, он читает из InputStream и преобразует его в List<String>. Я хотел бы прочитать о Java IO и попытаться повторить аналогичные функции.

Edit:

Похоже, класс Gobbler действительно включен в приведенный выше пример. Удалите имя пакета InputProcess из своего кода (или поместите класс Gobbler в пакет InputProcess), и все будет хорошо.

...