Java直接调用exe可执行文件传参并且获取返回值

引言

 

       平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装。因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况。那么这时候,就需要使用Java来直接调用这些出色的可执行文件。之前在开发有关GIS项目的时候其中有一个项目要平凡的用Java程序去调用exe可执行文件,具体为什么要这样做我也不清楚,一切任务听从领导的安排。

表达能力不好直接上代码~~~

 

一个小Case

其实很简单, 首先编写一个命令command;

Runtime.getRuntime()得到当前运行是环境;

然后调用它的exec(cmd)方法, 该方法返回一个进程process;

查看process的API可以看到, process只有几个方法, 却很有用, 如下:

destroy() 杀掉子进程;

exitValue(): 返回子进程的出口值;

getErrorStream(): 获得子进程的错误流;

       getInputStream(): 获得子进程的输入流;

       getOutputStream(): 获得子进程的输出流;

       waitFor(): 导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。

package com.hadoop.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

/*
 * 运行可执行文件:.exe
 * 当要执行一个本地机器上的可执行文件时,
 * 可以使用java.lang包中的Runtime类,首先使用Runtime类,首先
 * 使用Runtime类声明一个对象
 *{
 *    Runtime sc =Runtime.getRuntime();
 *   sc可以调用exec(String command) 方法打开本地湖区上的可执行文件或执行一个操作。    
 * }
 */
public class transferExe {

    public static void main(String[] args) {
        //需要传入的参数(ps: 多个参数用空格隔开)
        String paras = " --task C:\\Users\\Admin\\.cesiumlab\\tasks\\terrain_99254c80b1ef11ea8edfe728504fc83a.json --taskserver tcp://127.0.0.1:9001 --taskname 99254c80b1ef11ea8edfe728504fc83a --log_dir C:\\Users\\Admin\\.cesiumlab\\logs";

        //调用的exe可执行文件(ps: 调用可执行文件和参数拼接必须要用空格隔开)
        String cmd = "C:\\Program Files\\cesiumlab2\\tools\\terrainbuilder.exe" + paras; 

        openExe(cmd);

    }

    public static void openExe(String cmd) {
        BufferedReader br = null;
        BufferedReader brError = null;

        try {
            //执行exe  cmd可以为字符串(exe存放路径)也可为数组,调用exe时需要传入参数时,可以传数组调用(参数有顺序要求)
            Process p = Runtime.getRuntime().exec(cmd);
            String line = null;
            //获得子进程的输入流。
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            //获得子进程的错误流。
            brError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = br.readLine()) != null  || (line = brError.readLine()) != null) {
                //输出exe输出的信息以及错误信息
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中调用Java接口,可以使用PyJNIus库来实现,该库是一个Python的JNI(Java Native Interface)实现。 以下是一个示例,假设Java中有一个接口类`TestInterface`,其中有一个方法`testMethod`,它接收一个字符串类型的参数并返回一个字符串类型的值。 Java代码: ```java public interface TestInterface { public String testMethod(String str); } ``` Python代码: ```python from jnius import autoclass # 加载Java类 TestClass = autoclass('TestInterface') # 创建Java对象 test_obj = TestClass() # 调用Java方法 result = test_obj.testMethod("Hello from Python!") # 打印返回值 print(result) ``` 在执行Python代码时,需要将Java类的class文件加载到JVM中,可以通过设置`CLASSPATH`环境变量或使用`autoclass`函数中的`classpath`参数来实现。 另外,如果Java方法中有多个参数,可以使用`jobject`类型来传递Java对象,例如: Java代码: ```java public interface TestInterface { public int add(int a, int b); } ``` Python代码: ```python from jnius import autoclass # 加载Java类 TestClass = autoclass('TestInterface') # 创建Java对象 test_obj = TestClass() # 创建Java整数对象 a = autoclass('java.lang.Integer')(10) b = autoclass('java.lang.Integer')(20) # 调用Java方法 result = test_obj.add(a, b) # 打印返回值 print(result) ``` 注意:在使用PyJNIus库时,需要确保已经正确安装了Java环境,并且Python和Java的位数要一致。如果Python是64位的,则需要安装64位的Java环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值