ProcessBuilder 不能 return JSon 字符串
ProcessBuilder cannot return JSon String
我正在使用 ProcessBuilder 运行 命令。
命令输出为 jSON 格式,我想 return 字符串,然后将其与我的模型映射。
问题是我在尝试从进程中读取流时没有得到任何结果。
我使用的命令也有非 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);
我有结果..
你的进程几乎肯定是阻塞的,因为它的输出没有被读取。在它完成之前你不会开始读取它的输出,并且在它的输出被读取之前它不能完成,因为你的 child 进程产生足够的输出来填充 parent 和 [= 之间的管道缓冲区27=] 过程。由于在 child 为 运行 时没有任何内容正在读取管道,因此它会阻止尝试写入。
您的 non-JSON 输出可能较小,因此它不会填满进程输出流中的管道缓冲区,从而允许进程完成,然后您的 parent 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;
}
这是一个快速修复 - 它实际上不是很可靠。如果您的 child 进程也产生了严重的错误输出,那也可能会阻塞。
您可以根据需要使用redirectError()
, redirectInput()
, and redirectOutput()
方法来防止这种阻塞。
我正在使用 ProcessBuilder 运行 命令。 命令输出为 jSON 格式,我想 return 字符串,然后将其与我的模型映射。
问题是我在尝试从进程中读取流时没有得到任何结果。 我使用的命令也有非 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);
我有结果..
你的进程几乎肯定是阻塞的,因为它的输出没有被读取。在它完成之前你不会开始读取它的输出,并且在它的输出被读取之前它不能完成,因为你的 child 进程产生足够的输出来填充 parent 和 [= 之间的管道缓冲区27=] 过程。由于在 child 为 运行 时没有任何内容正在读取管道,因此它会阻止尝试写入。
您的 non-JSON 输出可能较小,因此它不会填满进程输出流中的管道缓冲区,从而允许进程完成,然后您的 parent 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;
}
这是一个快速修复 - 它实际上不是很可靠。如果您的 child 进程也产生了严重的错误输出,那也可能会阻塞。
您可以根据需要使用redirectError()
, redirectInput()
, and redirectOutput()
方法来防止这种阻塞。