当我运行python脚本时,输出显示在DOS上(Windows中的命令提示符)。
我希望输出显示在JAVA应用程序上,即在包含JTextArea的窗口上。输出应该与DOS上的输出相同。
所以,如何从DOS捕获输出并将其插入JAVA应用程序?
(我尝试将python脚本的输出存储在文本文件中,然后使用JAVA读取它。但是,在这种情况下,JAVA应用程序等待脚本先完成运行然后显示输出。并且,当输出超过屏幕大小,滚动条会出现,这样我就可以看到整个输出。)
在众人评论之后,我运行了这段代码。但输出总是:
错误: 流程说:
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);
}
}
谁能告诉我我做错了什么?
答案 0 :(得分:3)
您可以通过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
中,就像任何其他字符串一样。 (如果您愿意,可以在BufferedReader
周围使用InputStreamReader
,但是您明白了。)
答案 1 :(得分:0)
使用Runtime.exec()
或ProcessBuilder
时,您可以连接到错误和inputStream。
示例可以在这里找到: http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html