尝试读出进程输入流

  • 本文关键字:进程 输入流 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...");
} 

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

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

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

最新更新