BufferedReader - 打印整个输出

时间:2014-04-19 18:56:55

标签: java python

我正在尝试用Java打印python文件的输出。

python文件基本上是一个web scraper - 它有多个函数,每个函数都包含一些输出行。所以输出应该是一个接一个的序列。每行输出必须以规则的间隔(按照代码),而不是全部。 下面的代码打印输出但我只在整个程序运行后才将输出作为单个文本。

public class Samtest extends Thread {

public static void main(String[] args) {

  String pythonScriptPath0 = "IR_Component_module11.py";
  String[] cmd0 = new String[2];
  cmd0[0] = "C:\\Python27\\python.exe";
  cmd0[1] = pythonScriptPath0;
  Runtime rt0 = Runtime.getRuntime();
  java.lang.Process pr0 = rt0.exec(cmd0);
  BufferedReader bfr0 = new BufferedReader(new InputStreamReader(pr0.getInputStream()));
  String line0 = "";
  while((line0 = bfr0.readLine()) != null)
  {
    System.out.println(line0);
  }

 }
}

我需要根据程序运行自然地输出。但是我在程序运行后得到了整个输出。刮刀由一个GUI组成。所以只有当我退出GUI时才能获得输出。

2 个答案:

答案 0 :(得分:1)

您正在接收的输出是由python脚本创建/生成的,然后将此输出传递给最终打印出来的java程序。如果python脚本尚未完成执行,则无法接收其输出。所以,你的java程序等待python脚本完成它的执行,然后它从你的python脚本中检索输出,最后打印出来。这就是关闭GUI时获得输出的原因。

使用简单的python脚本尝试一下。创建一个包含以下内容的python脚本:

import time
print 'Hello'
time.sleep(2)
print 'TimeUp'

如果使用python执行此脚本,则可能会看到它首先打印Hello,然后在2秒之后打印TimeUp。但是当你使用java程序执行相同的脚本时。您将完全看到整个输出。因为你的java程序会等待python脚本完成。我希望你现在明白原因了。 使用线程无法解决此问题

你的案例中的执行顺序是:python-script -----> Java程序----->控制台输出

execution

Here是一个有趣的问题,可能对您有所帮助。

答案 1 :(得分:1)

修改

Python缓冲输出。使用-u

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Samtest extends Thread {

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

        String pythonScriptPath0 = "IR_Component_module11.py";
        String[] cmd0 = new String[3];
        cmd0[0] = "C:\\Python27\\python.exe";
        cmd0[1] = "-u";
        cmd0[2] = pythonScriptPath0;
        Runtime rt0 = Runtime.getRuntime();
        java.lang.Process pr0 = rt0.exec(cmd0);
        BufferedReader bfr0 = new BufferedReader(new InputStreamReader(pr0.getInputStream()));
        String line0 = "";
        while ((line0 = bfr0.readLine()) != null) {
            System.out.println(line0);
        }

    }
}