本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Java 代码中调用 shell 脚本和 python 脚本并获得输出结果(分为小数 据量和大数据量) 2015/12/23 3161 Java 代码中调用 shell 和 python 脚本有多种实现方式,通用方 式是使用 java.lang 中的 Runtime 类新开进程,调用 python 脚本的一个例子如下 (shell 同理): public String python(String pythonPath, String[] params) { File file = new File(pythonPath); if (!file.exists()){ return “python 脚本不存在!”; String[] command = Arrays.copyOf(new String[]{“python”, pythonPath}, params.length + 2); System.arraycopy(params, 0, command, 2, params.length); List res = new ArrayList (); try { Process process = Runtime.getRuntime().exec(command, null, null); process.waitFor(); Scanner scanner = new Scanner(process.getInputStream()); while (scanner.hasNextLine()) { String line = scanner.nextLine(); res.add(line); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); return “success”; } 例子中,参数 pythonPath 就是 python 脚本的绝对路径,参数 params 是脚本的参数数组,command 就是执行 python 命令字符串数组,格式就是 python + 脚本 + 参数,构造好 command 后传入 exec()中执行新进程,然后调用 waitFor()函 数等待进程结束,结束后从进程的输入流中获得脚本的输出结果存储到字符串数组 中。 乍一看,上面的代码并没有问题,对于少量的输出结果执行后相当完美,但是 当脚本的输出结果大小大于 inputStream 缓冲区大小时,程序会阻塞在 waitFor()函数 这里,问题就在于脚本的输出结果是在进程执行完之后才读取,一个好的解决办法 就是新开一个清理线程来不断清空缓冲区,也就是输出和读取同时进行,代码如 下: 本文来源:https://www.wddqw.com/doc/01770185e3bd960590c69ec3d5bbfd0a7856d512.html