2012-12-03 83 views
0

在以下情况下,我们正在处理一个控制台应用程序,其中有一个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..."); 
} 
+0

当您运行的代码是什么呢? – wchargin

+0

它只是没有做任何事情。看似经历了一次循环,就是这样。请注意,这些进程中的一部分发生在并行线程中。 – Sam

+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(); 
} 

这种错误显然足以解释为什么该代码将阻止...

+0

非常感谢。我实施了您的更改,并且在通过一些记录后代码仍然停止。 – Sam

+0

您需要使用调试器...或添加traceprints ...来确定实际发送到外部进程并从中接收的内容。 –