Java 调用执行其他语言的程序
一般的场景可以通过使用 Runtime.getRuntime().exec() 来完成,该命令返回一个 Process 对象实例。
...
String[] cmdArgs = {"Rscript", medreportPath, "-i", destFilePath1, "-o", webRptPath + "/" + runID};
// String command = "Rscript " + medreportPath + " -i " + destFilePath1 + " -o " + webRptPath + "/" + runID;
try {
Process process = Runtime.getRuntime().exec(cmdArgs); // 调动外部程序
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)); // 获取标准输出
String line;
while ((line = br.readLine()) != null) {
System.out.println(line + "\n");
}
BufferedReader brError = new BufferedReader(new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8)); // 获取标准错误输出
String lineError;
while((lineError = brError.readLine()) != null) {
System.out.println(lineError + "\n");
}
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
...
以 Java 调用 Python 为例
1. 使用 Runtime 类
该方式简单,但是增加了 Java 对python 的依赖,需要事先安装python,及python程序依赖的第三方库
Runtime 使用了单例模式,只能使用 Runtime 的 static 方法获取实例
可以调用 exec() 来执行外部程序,返回 Process 对象实例
public class Runtime extends Object // Runtime 直接继承 Object
public static Runtime getRunTime() // 获取 Runtime 实例的 static 方法
public Process exec(...) throws IOException // 执行外部程序,exec()有多个重载方法
例子
Java 程序代码
package java_python; import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader; /*
* 直接使用 Runtime 调用外部程序
* 在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。
* 需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,然后在Java中通过标准输入流读取Python的输出值。
*/
public class RunPythonByRuntime {
public static void main(String[] args) {
String exe = "python"; // 使用python3 依赖biopython
String command = "C:\\Users\\mail.simcere.com\\eclipse-workspace\\python_test\\test\\test01.py"; // python 脚本路径
String term = "meningitis"; // 参数
String[] cmdArr = new String[] {exe, command, term};
Process process;
try {
process = Runtime.getRuntime().exec(cmdArr); // 执行python程序
InputStream inputStream = process.getInputStream(); // 获取python程序的标准输出
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); // 转换为BufferedReader对象实例
String line = null;
while((line = bufferedReader.readLine()) != null) { // 逐行读入python程序的输出结果
System.out.println(line);
}
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Python 程序代码
#coding=utf-8 import sys
from Bio import Entrez
from Bio import Medline term = sys.argv[1] # 需要外界传入 meningitis
retmax = 5 # 控制返回的文献数目
Entrez.email = "771966294@qq.com"
handle = Entrez.esearch(db="pubmed", term=term, retmax=retmax)
record = Entrez.read(handle)
handle = Entrez.efetch(db="pubmed", id=record["IdList"], rettype="medline", retmode="text")
records = Medline.parse(handle)
records = list(records)
handle.close()
rst = ""
for record in records: # record 是一个字典
rst += ">\nPMID:" + record.get("PMID", "?") \
+ "\nTitle:" + record.get("TI", "?") \
+ "\nAuthors:" + ";".join(record.get("AU", "?")) \
+ "\nAbstract:" + record.get("AB", "?") \
+ "\nKeywords:" + ";".join(record.get("OT", "?")) \
+ "\nMesh Terms:" + ";".join(record.get("MH", "?")) \
+ "\nJournal:" + record.get("TA", "?") \
+ "\nDate of Publication:" + record.get("DP", "?") \
+ "\ndoi:" + record.get("SO", "?") \
+ "\n"
print(rst)
2. 使用 Jython 需要事先安装 Jython
通过 Jython 可以实现 Java 和 Python 的互相调用,使粒度更加精细,但并没用解决耦合度的问题。
https://www.cnblogs.com/nuccch/p/8435693.html
Java 调用执行其他语言的程序的更多相关文章
- java 调用系统外部的某个程序
有时候我们java 调用系统外部的某个程序 可能需要调用系统外部的某个程序,此时就可以用Runtime.getRuntime().exec()来调用,他会生成一个新的进程去运行调用的程序. 此方法返回 ...
- 在window下, Java调用执行bat脚本
参考博客: https://www.cnblogs.com/jing1617/p/6430141.html 最近一段时间用到了Java去执行window下的bat脚本, 这里简单记录一下: 我这里是先 ...
- java调用执行cmd指令启动weblogic
这里的例子是启动weblogic import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- java调用执行cmd命令
未经允许,禁止转载!!! package practice; import java.io.BufferedReader; import java.io.File; import java.io.IO ...
- Java 调用并执行cmd命令
cmd java 调用 执行 概要: Java 调用并执行cmd命令 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 ...
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- Java调用R语言
R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/ ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
随机推荐
- 显示开机信息-dmesg
显示开机信息-dmesg kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息亦保存在/var/log目录中,名称为dmesg的文件里. ...
- 【学习】python文件读写,用with open as的好处,非常好【转载】
原文链接:http://www.cnblogs.com/ymjyqsx/p/6554817.html 备注:博主还有很多值得学习的笔记,遇到问题可以拜读,非常感谢博主的总结 读写文件是最常见的IO操作 ...
- 编程实现将一个N进制数转换成M进制数
问题:编程实现将一个N进制数转换成M进制数.(c/c++.Java.Javascript.C#.Python) 1.Python 手写算法版 def conversion_num(num, src, ...
- Shell脚本中变量和函数变量的作用域
(1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止.(2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变 ...
- python3下GUI界面设计之控件精确定位
#codeing:utf-8import tkinterimport tkinter.messageboxfrom tkinter import filedialogfrom tkinter impo ...
- Linux网络编程学习(十一) ----- 五种I/O模式(第六章)
1.五种I/O模式是哪几个? 阻塞I/O,非阻塞I/O,I/O多路复用,信号驱动I/O(SIGIO),异步I/O 一般来讲程序进行输入操作有两个步骤,一是等待有数据可读,二是将数据从系统内核中拷贝到程 ...
- v8:: fatalProcessOutOfMemory
express项目,用于画图读写图片数据, pm2 作为进城守护. 生产环节报警:v8:: fatalProcessOutOfMemory,xxxx等,一时不知道什么原因. linux系统下使用如下命 ...
- windows系统如何安装运行filebeat
下载安装包 下载地址:https://www.elastic.co/downloads/beats/filebeat 解压到指定目录,无需安装 打开解压后的目录,打开filebeat.yml进行配置. ...
- Halcon知识点随记(每日更新)
部分积累自重码网视频 1.dev_update_off.dev_update_on 一般dev_update_off放在开始,dev_update_on放在程序结束 dev_update_window ...
- Zabbix监控平台3.2.4(二)深入理解zabbix
一,Zabbix Web操作深入 1.1 Zabbix Web下的主机和模版以及监控项的添加方式 (1)创建一个模版 我们所有的功能几乎都是在模版中定义的 我们再点进新创建的模版查看 模版里几乎可 ...