试图读取进程输入流

时间:2012-12-03 02:48:18

标签: java

在下面的场景中,我们正在处理一个控制台应用程序,其中有一个PHP脚本作为java应用程序中的进程运行。每次为脚本提供两个值并返回“OK”或“ERR”。我正在尝试捕获从输入到脚本的时间以及返回时间为“OK”或“ERR”值的时间。

我已经实现了以下修复,但它似乎仍然无法正常工作。如果有人能说清楚。

try {
        proc = runtime.exec("php " + "script.php");            


        inp = new BufferedReader( new InputStreamReader(proc.getInputStream()) );
        out = new BufferedWriter( new OutputStreamWriter(proc.getOutputStream()) );

        while (true) {
            temp = getRandomUser() + " " + getRandomHost();
            startTime = System.currentTimeMillis();
            //System.out.println(temp);

            print(pipe(temp));

            while (!inp.readLine().equals("ERR") || !inp.readLine().equals("OK")) {
            }

            endTime = System.currentTimeMillis();
            procTime = (long) endTime - startTime;

            fout.write(Double.toString(procTime));
            fout.newLine();
            //System.out.println("! " + procTime);
        }


} catch (IOException ex) {
        System.out.println("Thread prematurely Terminated...");
} 

1 个答案:

答案 0 :(得分:1)

您对症状的描述不清楚。然而,这几乎肯定是错误的:

while (!inp.readLine().equals("ERR") || !inp.readLine().equals("OK")) {
}

首先,如果您到达流的末尾,readLine将返回null,当您尝试在其上调用equals时,您将获得NPE。

其次,条件实际上是两次调用readLine()。看起来你的意图是阅读并扔掉线,直到你得到一个匹配“ERR”或“OK”。但代码并没有这样做。实际上,如果它读取的第一条重要线条是“OK”,则条件不会触发......并且您将继续尝试阅读。代码应该是这样的:

String line = inp.readLine();
while (line != null && !line.equals("ERR") && !line.equals("OK")) {
    line = inp.readLine();
}

这个错误肯定足以解释为什么代码会阻止......