Java 等待进程类的方法不';不归
我的代码中有一个Process类,当我试图从inputbuffer读取大量数据时,它无法读取inputbufferreader数据,而Process类的waitfor方法从未返回任何内容Java 等待进程类的方法不';不归,java,process,bufferedreader,runtime.exec,Java,Process,Bufferedreader,Runtime.exec,我的代码中有一个Process类,当我试图从inputbuffer读取大量数据时,它无法读取inputbufferreader数据,而Process类的waitfor方法从未返回任何内容 此问题发生在live server中 但下面的代码运行良好,并从本地服务器的inputbuffer读取所有数据 private static JSONObject ExecJniApp(String inputJsonString) throws JniException { int exitStatus =
- 此问题发生在live server中
- 但下面的代码运行良好,并从本地服务器的inputbuffer读取所有数据
private static JSONObject ExecJniApp(String inputJsonString) throws JniException { int exitStatus = 0; String workingDirectory = JniSettings.getJniAppDirectory(); String command = workingDirectory + binaryName; System.out.println("ExecJniApp: inputJsonString: " + inputJsonString); String outputString = ""; try { Process p = Runtime.getRuntime().exec(command, null, new File(workingDirectory)); // send input vi stdin BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); writer.write("\n>>>>>>>>>>"); writer.write(inputJsonString); writer.write("<<<<<<<<<<\n"); writer.flush(); if (JniSettings.isLinux()) { p.waitFor(); } else { // System.out.println("ExecJniApp: windows wait for"); } BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); for (;;) { String line = reader.readLine(); if (line == null) { break; } // System.out.println(line); outputString += line + "\n"; } // exit code of command and log error detail // exit status = 0 -> Success exitStatus = p.exitValue(); if (exitStatus != 0) { System.out.println("ExecJniApp: inputJsonString: " + inputJsonString); System.out.println("ExecJniApp: outputString:\n" + outputString); throw new Exception("Exit status other than zero :- " + exitStatus + "\noutput: "); } } catch (Exception e) { // System.out.println("ExecJniApp failed"); e.printStackTrace(); throw new JniException("JniInterface failed"); } System.out.println("ExecJniApp: outputString:\n" + outputString); int index1 = outputString.indexOf(">>>>>>>>>>"); if (index1 == -1) { // System.out.println("ExecJniApp failed, Invalid output format"); throw new JniException("ExecJniApp failed, Invalid output format"); } index1 += 10; int index2 = outputString.indexOf("<<<<<<<<<<"); if (index2 == -1 || index2 <= index1) { // System.out.println("ExecJniApp failed, Invalid output format"); throw new JniException("ExecJniApp failed, Invalid output format"); } String outputJsonString = outputString.substring(index1, index2); // System.out.println("ExecJniApp: outputJsonString: " + outputJsonString); JSONParser parser = new JSONParser(); JSONObject obj = null; try { obj = (JSONObject) parser.parse(outputJsonString); } catch (ParseException e) { // System.out.println("ExecJniApp failed, Json parse failed"); e.printStackTrace(); throw new JniException("JniInterface failed, Json parse failed"); } Object errorObject = obj.get("error"); if (errorObject != null) { String errorString = errorObject.toString(); // System.out.println("ExecJniApp failed, " + errorString); throw new JniException("ExecJniApp failed, " + errorString); } return obj; }
private static JSONObject ExecJniApp(String inputJsonString)抛出JniException { int exitStatus=0; String workingDirectory=JniSettings.getJniAppDirectory(); String命令=workingDirectory+binaryName; System.out.println(“ExecJniApp:inputJsonString:”+inputJsonString); 字符串outputString=“”; 尝试 { 进程p=Runtime.getRuntime().exec(命令,null,新文件(workingDirectory)); //发送输入vi-stdin BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(p.getOutputStream()); writer.write(“\n>>>>>>”; writer.write(inputJsonString); 作者:写(“>”); 如果(index1==-1) { //System.out.println(“ExecJniApp失败,输出格式无效”); 抛出新的JniException(“ExecJniApp失败,输出格式无效”); } index1+=10;
int index2=outputString.indexOf(“只需将您的代码替换为以下代码即可。
必须关闭InputStream连接Process p = Runtime.getRuntime().exec(command, null, new File(workingDirectory)); // send input vi stdin BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); writer.write("\n>>>>>>>>>>"); writer.write(inputJsonString); writer.write("<<<<<<<<<<\n"); writer.flush(); try{ BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); for (;;) { String line = reader.readLine(); if (line == null) { break; } // System.out.println(line); outputString += line + "\n"; } p.getOutputStream().close(); p.getInputStream().close(); } catch(Exception e) { e.printStackTrace(); } if (JniSettings.isLinux()) { p.waitFor(); } else { // System.out.println("ExecJniApp: windows wait for"); } // exit code of command and log error detail // exit status = 0 -> Success exitStatus = p.exitValue(); if (exitStatus != 0) { System.out.println("ExecJniApp: inputJsonString: " + inputJsonString); System.out.println("ExecJniApp: outputString:\n" + outputString); throw new Exception("Exit status other than zero :- " + exitStatus + "\noutput: "); }
processp=Runtime.getRuntime().exec(命令,null,新文件(workingDirectory)); //发送输入vi-stdin BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(p.getOutputStream()); writer.write(“\n>>>>>>”; writer.write(inputJsonString);
编写。(写命令是什么?命令执行C++ exe文件,而不是描述它。这里我有更改代码以完全理解它的全部场景。