【问题标题】:Capture the output of DOS (command prompt) and display in a JAVA Frame捕获 DOS(命令提示符)的输出并在 JAVA 框架中显示
【发布时间】:2012-05-24 10:25:21
【问题描述】:

当我运行 python 脚本时,输出出现在 DOS 上(Windows 中的命令提示符)。

我希望输出显示在 JAVA 应用程序上,即包含 JTextArea 的窗口上。输出应与 DOS 上的相同。

那么,如何捕获 DOS 的输出并将其插入 JAVA 应用程序??

(我尝试将 python 脚本的输出存储在一个文本文件中,然后使用 JAVA 读取它。但是,在这种情况下,JAVA 应用程序首先等待脚本完成运行,然后显示输出。并且,当输出大于屏幕大小,会出现滚动条,这样我就可以看到整个输出。)


在crowder 的评论之后,我运行了这段代码。但输出始终是:

错误: 进程说:

import java.io.*;
import java.lang.*;
import java.util.*;
class useGobbler {
        public static void main ( String args[] )
        {
        ProcessBuilder pb; 
        Process p;
        Reader r;
        StringBuilder sb;
        int ch;

        sb = new StringBuilder(2000);

        try
        {
            pb = new ProcessBuilder("python","printHello.py");
            p = pb.start();

            r = new InputStreamReader(p.getInputStream());
            while((ch =r.read() ) != -1)
            {
                sb.append((char)ch);
            }

        }
        catch(IOException e)
        {
            System.out.println("error");

        }

        System.out.println("Process said:" + sb);
    }
}

谁能告诉我我做错了什么??

【问题讨论】:

  • 更新您的信息(这确实是一个完全不同的问题):异常的详细信息是什么?这很重要。 :-) 它会有有用的信息,告诉你为什么会出现IOException猜测,我会说python 不在您的路径中,或者preintHello.py 不在当前目录中。
  • 文件在同一目录下。绝对地址是 C:\Users\parth.k\Documents\printHello.py 就 'python' 而言,当我在命令提示符下键入 'python' 时,它会给出错误提示“它不被识别为内部或外部命令……”而且,您的意思是说,如果我打印异常的详细信息,我们将能够找出确切的原因??在这种情况下,我会将其打印出来并回复您。
  • @user:是的,我的意思是如果你输出异常的文本,它会告诉你哪里出了问题。但是在您的情况下,您已经知道:“...不被识别为内部或外部命令” 所以python 不在您的路径中,Java 无法运行它。该错误消息听起来像 Windows,所以这个页面应该会有所帮助:docs.python.org/faq/… 这部分内容与 Java 或您的原始问题无关。

标签: java capture


【解决方案1】:

您可以通过ProcessBuilder 执行该过程,这将为您提供一个Process 实例,您可以在该实例上通过getInputStream 返回的流读取输出。

这是一个运行 Python 脚本 hello.py 并在字符串中构建其输出的示例:

import java.io.Reader;
import java.io.IOException;
import java.io.InputStreamReader;

public class RunPython {
    public static final void main(String[] args) {
        ProcessBuilder  pb;
        Process         p;
        Reader          r;
        StringBuilder   sb;
        int             ch;

        // Start the process, build up its output in a string
        sb = new StringBuilder(2000);
        try {
            // Create the process and start it
            pb = new ProcessBuilder("python", "hello.py");
            p = pb.start();

            // Get access to its output
            r = new InputStreamReader(p.getInputStream());

            // Read until we run out of output
            while ((ch = r.read()) != -1) {
                sb.append((char)ch);
            }
        }
        catch (IOException ex) {
            // Handle the I/O exception appropriately.
            // Here I just dump it out, which is not appropriate
            // for real apps.
            System.err.println("Exception: " + ex.getMessage());
            System.exit(-1);
        }

        // Do what you want with the string; in this case, I'll output
        // it to stdout
        System.out.println("Process said: " + sb);
    }
}

然后,您可以对字符串做任何您喜欢的事情,包括像任何其他字符串一样将其放入JTextArea。 (如果你愿意,你可以在InputStreamReader 周围使用BufferedReader,但你明白了。)

【讨论】:

  • 我看到“刚刚”成长为 OP 的最大问题 :) 他需要一个 SwingWorker/invokeLater,这通常会让新手目瞪口呆。
  • @Crowder:谢谢。我会试一试。 :)
  • @user1414696:我已经为您的情况更新了一个更好的示例;文档中涉及重定向等的示例对于您的目的而言具有低信噪比。 :-) 如果您尝试进行临时更新等,请注意 Marko 关于线程交互的观点。
  • @MarkoTopolnik:不一定,这取决于进程运行多长时间以及 OP 是否要进行临时更新。
  • 好点。如果它只是一个带有几行输出的瞬间 Python 脚本,那么 GUI 可能会在运行时阻塞。
【解决方案2】:

您可以连接到错误和 inputStream,同时使用 Runtime.exec()ProcessBuilder

可在此处找到示例: http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2014-04-16
    相关资源
    最近更新 更多