Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder无法返回JSon字符串_Java_Json_Child Process - Fatal编程技术网

Java ProcessBuilder无法返回JSon字符串

Java ProcessBuilder无法返回JSon字符串,java,json,child-process,Java,Json,Child Process,我正在使用ProcessBuilder运行一个命令。 命令输出是jSON格式的,我希望返回字符串,然后将其映射到我的模型 问题是,当我试图从进程中读取流时,没有得到任何结果。 我使用的命令还有一个非jSON输出。如果我使用这个命令版本,我会得到结果,因此只有当我想读取jSON时才会出现问题 public String getPlate(String image) throws IOException, InterruptedException{ ProcessBuilder pb

我正在使用ProcessBuilder运行一个命令。 命令输出是jSON格式的,我希望返回字符串,然后将其映射到我的模型

问题是,当我试图从进程中读取流时,没有得到任何结果。 我使用的命令还有一个非jSON输出。如果我使用这个命令版本,我会得到结果,因此只有当我想读取jSON时才会出现问题

public String getPlate(String image) throws IOException, InterruptedException{
        ProcessBuilder pb = new ProcessBuilder("alpr", "-c eu", "-j on", "-n 1", image);
        Process p = pb.start();
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line;
        while ( (line = reader.readLine()) != null) {
               builder.append(line);
               builder.append(System.getProperty("line.separator"));
            }
            String result = builder.toString();
            return result;
    }
如果使用非jSON版本,则使用此命令不会给出任何结果

ProcessBuilder pb = new ProcessBuilder("alpr", "-c eu", "-n 1", image);

我得到了结果。

您的进程几乎肯定是阻塞的,因为它的输出没有被读取。在完成之前,您不会开始读取其输出,在读取其输出之前,它也不会完成,因为您的子进程生成的输出足以填充父进程和子进程之间的管道缓冲区。由于在孩子运行时没有任何东西在读取管道,因此它会阻止尝试写入

您的非JSON输出可能更小,因此它不会填充流程输出流中的管道缓冲区,从而允许流程完成,然后您的父Java流程可以读取管道缓冲区中的数据

你需要改变你正在做的事情的顺序:

public String getPlate(String image) throws IOException, InterruptedException{
        ProcessBuilder pb =
            new ProcessBuilder("alpr", "-c eu", "-j on", "-n 1", image);
        Process p = pb.start();

        BufferedReader reader =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line;
        while ( (line = reader.readLine()) != null) {
               builder.append(line);
               builder.append(System.getProperty("line.separator"));
        }

        // wait for the child process *after*
        // reading all its output
        p.waitFor();

        String result = builder.toString();
        return result;
}
这是一个快速修复-它实际上不是很健壮。如果您的子进程也生成了显著的错误输出,那么这也会造成阻塞

您可以根据需要使用这些方法来防止这种阻塞