【问题标题】:Run an interactive Dos program from java从 java 运行交互式 Dos 程序
【发布时间】:2012-01-09 01:13:03
【问题描述】:

我想从 Web 服务器运行 Dos 程序。 Dos 程序必须以交互方式运行,因为用户界面是通过一系列问题和答案来实现的。一个问题的答案将决定下一个问题。我将不得不在 Web 服务器上使用 ajax,但我想我可以做到。

我在 Stackoverflow 上找到了一个 java 程序,它似乎做了一些与我想要的类似的事情。但是,当我编译程序时,我得到一个错误,即。

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

堆栈溢出问题的url是

How can I write large output to 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 吗?

感谢您的帮助

彼得

【问题讨论】:

    标签: java multithreading dos


    【解决方案1】:

    我认为很明显您缺少此代码的部分内容。 OP 的帖子中没有包含名为 InputProcess 的包,它有一个名为 Gobbler 的类。可能是因为这与他们的问题无关。

    错误消息本质上说它找不到它正在寻找的这个包/代码。

    这个类究竟做了什么,只有 OP 可以告诉你。不过,在最基本的情况下,它似乎从InputStream 读取并将其转换为List&lt;String&gt;。我会阅读 Java IO 并尝试复制类似的功能。

    编辑:

    看起来Gobbler 类确实包含在上面的示例中。从您的代码中删除 InputProcess 包名称(或将 Gobbler 类放入 InputProcess 包中),您应该一切顺利。

    【讨论】:

    • 我阅读了您的评论,然后我意识到 Gobbler 是上面定义的。我刚刚删除了“InputProcess”。从上面的代码,现在它编译并运行良好。感谢您触发答案。干杯
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多