有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

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

    这个bug当然足以解释为什么代码会阻塞