精华内容
下载资源
问答
  • java运行外部程序

    千次阅读 2018-05-18 19:01:54
    如何用java代码运行外部程序?package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; ...

    如何用java代码运行外部程序?

    package com.test;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    
    public class EXERunner {
    
    	public void runExe(String exePath) {
    		try {
    			Process process = Runtime.getRuntime().exec(exePath);
    			// 注:process进程的输出流 相对于本进程就是输入流
    			Thread errorHandler = new Thread(new ErrorIOHandler(process.getErrorStream()));
    			Thread normalHandler = new Thread(new NormalIOHandler(process.getInputStream()));
    			Thread cmdHandler = new Thread(new CmdIOHandler(process.getOutputStream()));
    			errorHandler.start();
    			normalHandler.start();
    			cmdHandler.start();
    			process.waitFor(); // 等待process进程的输出流都被处理
    			int exitValue = process.exitValue();
    			if (exitValue == 0) {
    				System.out.println("进程正常退出");
    			} else {
    				System.out.println("进程异常退出");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args) {
    		new EXERunner().runExe("C:\\Windows\\System32\\ipconfig.exe");
    	}
    }
    
    // 处理外部程序的错误输出流
    class ErrorIOHandler implements Runnable {
    
    	private InputStream error;
    
    	public ErrorIOHandler(InputStream error) {
    		this.error = error;
    	}
    
    	@Override
    	public void run() {
    		BufferedReader br = new BufferedReader(new InputStreamReader(error));
    		String line = "";
    		try {
    			while ((line = br.readLine()) != null) {
    				System.out.println(line);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    // 处理外部程序的正常输出流
    class NormalIOHandler implements Runnable {
    
    	private InputStream normal;
    
    	public NormalIOHandler(InputStream normal) {
    		this.normal = normal;
    	}
    
    	@Override
    	public void run() {
    		BufferedReader br = new BufferedReader(new InputStreamReader(normal));
    		String line = "";
    		try {
    			while ((line = br.readLine()) != null) {
    				System.out.println(line);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    // 给外部程序发送命令
    class CmdIOHandler implements Runnable {
    
    	private OutputStream out;
    
    	public CmdIOHandler(OutputStream out) {
    		this.out = out;
    	}
    
    	@Override
    	public void run() {
    		try {
    			String line = "";
    			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//控制台读取流
    			while (true) {
    				line = br.readLine();//从控制台读取一行
    				if (line.equals("")) {
    					break;
    				} else {
    					out.write((line + "\r\n").getBytes());//发送命令给外部程序
    				}
    				out.flush();
    			}
    			br.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    展开全文
  • 主要介绍了Java编程使用Runtime和Process类运行外部程序的方法,结合实例形式分析了java使用Runtime.getRuntime().exec()方法运行外部程序的常见情况与操作技巧,需要的朋友可以参考下
  • java程序可以调用Jvm外部的一些应用程序来完成一些功能.目前基于JDK1.8来做实验~ 目前java有如下两种方式来调用其它程序,Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录...

    序言

             java程序可以调用Jvm外部的一些应用程序来完成一些功能.目前基于JDK1.8来做实验~

            目前java有如下两种方式来调用其它程序, Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数环境变量工作目录。(这些都能设置,就是帮你找到外部可执行文件的位置与启动变量,具体怎么执行,可以查看Runtime和ProcessBuilder的构造方法,里面有设置)

           但是这两种方法都会返回一个用于管理操作系统进程的Process对象。另外两者的启动差别不是很大.最终生成的Process子进程是独立于Jvm之外的进程,就算没有对象应用指向它,它也不会被GC关闭或者释放.

            在用Runtime.getRuntime().exec()或ProcessBuilder(array).start()创建子进程Process之后,一定要及时取走子进程的输出信息和错误信息,否则输出信息流和错误信息流很可能因为信息太多导致被填满,最终导致子进程阻塞住,然后执行不下去。

           这么来说其实重要的是Process的使用.

    1. Runtime的exec()方法,并返回一个Process对象
    2. ProcessBuilder的start()方法,并返回一个Process对象

    Runtime

            Runtime类是Java程序的运行时环境。不能new出一个Runtime对象,只能通过getRuntime()方法获取当前Runtime运行时对象的引用。然后可以调用Runtime的方法查看和修改Java虚拟机的状态。

            Runtime的主要的方法如下所示:

    • exec方法接收一个命令然后执行,通过该方法可以执行和cmd中用法一样命令。比如,Runtime.getRuntime().exec(“ls”),就和cmd中执行ls效果一样了。
    • freeMemory()可以查看当前虚拟机内存中空闲内存还有多少。
    • totalMemory()可以查看当前虚拟机使用的总内存大小。
    • maxMemory()可以查看JVM的最终可以使用的最大内存是多少。
    • availableProcessors()可以查看本机有多少处理器,即本机处理器是多少核。
    • exit(int)方法可以退出当前Java程序的运行,System.exit(int)方法就是调用了Runtime.exit(int)方法来退出运行的。
    • 示例,

    ProcessBuilder

            ProcessBuilder是java 5.0引入的,start()方法返回Process的一个实例.所以被推荐使用~~

            Runtime和ProcessBuilder的不同点就是,启动子进程时的命令形式不同,Runtime.getRuntime.exec()可以把命令和参数写在一个String中,用空格分开,ProcessBuilder则是构造函数的参数中,传递一个由命令和参数组成的list或数组。

            ProcessBuilder的构造方法接收一个命令参数的数组形式,其中,第一个元素代表要执行的系统命令,后面的元素代表要传给该命令的参数。

            ProcessBuilder 没有Runtime那样直接获取环境参数的方法,只有一个getenviroment返回一个Map~.

         

    Process

    看下Api怎么说的,从中分理处一些关键信息;

    java.lang 
    类 Process
    java.lang.Object
    
    java.lang.Process
    
    public abstract class Processextends Object
    
    ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该
    实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检
    查进程的退出状态以及销毁(杀掉)进程的方法。 
    创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,
    Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的
    所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、
    getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得
    从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或
    输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 cuiyaonan2000@163.com
    
    当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 
    
    对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。
    

    关键点:

    1. Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。 
    2. 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 

    3. 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。(毛意思:就是单线程么,不需要在建子进程来分担任务量么~~~~~~)

    destroy

           杀掉该Process对象代表的进程。(还有个以强杀方法.是不是类似于kill -9 ~~~)

    exitValue

            返回该Process对象代表的进程的出口值,值0表示正常退出,非0非正常。关于该方法,应该是返回System.exit(int)方法中的参数。

    waitFor

            返回该Process对象代表的进程的出口值,值0表示正常退出,非0非正常。

            该方法很类似exitValue方法,但是他们有个取别很大的地方,那就是exitValue方法会直接返回一个值,但是当前程序有可能还在运行中,所以该值不一定是正确的,而本方法会一直等待Process对象代表的进程退出后才返回值,而且调用本方法的进程将会一直堵塞等待返回值。建议使用本方法!

    关于获取外部进程的日志的问题

    getErrorStream:是获取的错误日志(即error级别的日志)

    getInputStream:是获取外部进程的一般性日志如(info,warn,debug)

    平时我们的一份完整的日志应该是 info+error的日志 才算完整.所以应该把这2个流合并到一起展示,才是完整的.方法如下

    import java.io.*;
    
    
    public class Test {
    
        public static void main(String[] args) throws IOException, InterruptedException {
    	Runtime rt = Runtime.getRuntime();//获得Runtime对象
    	String arr[] = {"CLASSPATH=D://","Path=C:\\Program Files\\Java\\jdk1.8.0_131\\bin"};//执行exec时的环境变量
            
            //exec方法第一个参数是执行的命令,第二个参数是环境变量,第三个参数是工作目录
    	Process pr = rt.exec("cmd /c javac a.java && java a", arr, new File("D://"));
            
            //获取输出流并转换成缓冲区
            BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));
            bout.write("1 2");//输出数据
            bout.close();//关闭流
            
            //SequenceInputStream是一个串联流,能够把两个流结合起来,通过该对象就可以将
            //getInputStream方法和getErrorStream方法获取到的流一起进行查看了,当然也可以单独操作
    	SequenceInputStream sis = new SequenceInputStream(pr.getInputStream(), pr.getErrorStream());
    	InputStreamReader inst = new InputStreamReader(sis, "GBK");//设置编码格式并转换为输入流
    	BufferedReader br = new BufferedReader(inst);//输入流缓冲区
    
    	String res = null;
    	StringBuilder sb = new StringBuilder();
    	while ((res = br.readLine()) != null) {//循环读取缓冲区中的数据
    	    sb.append(res+"\n");
    	}
    	br.close();
    	pr.waitFor();
    	pr.destroy();
    	System.out.print(sb);//输出获取的数据
        }
    }

    展开全文
  • 1.‘java’ 不是内部或外部命令,也不是可运行程序 或批处理文件。 出现这种情况一般来说是没有配置环境变量或者是没有配置好 (1)找到安装java的位置 (每个人的不一样 自己看看) (2)进入控制面板==》系统与...
  • 亦可以使用Runtime调用外部程序 public static void main(String []args) throws IOException { List<String> command = new ArrayList<>(); command.add("C:\\Program Files\\...

    亦可以使用Runtime调用外部程序

    public static void main(String []args) throws IOException {
    
            List<String> command = new ArrayList<>();
            command.add("C:\\Program Files\\Mozilla Firefox\\firefox.exe");
            
            // 执行cmd命令
            
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(command);
            Process process = builder.start();
            System.out.println(process.isAlive());
    
    
        }
    
    展开全文
  • linux下运行java方法,1.安装jdk 2.javac Helloword.java 3.java Helloword
  • 背景:java 支持多线程,这是绝大多数程序... 同时,java程序也支持开启新的进程,或者叫做java调用外部应用程序。这里的实现方式java提供了两个类:Process、RunTime。  这些类之间的关系:  1.通过ProcessBuilder...

    背景:java 支持多线程,这是绝大多数程序都满足的必要条件,因为多线程个可以增加程序的“吞吐量”,提高用户对软件的流畅性体验。
                同时,java程序也支持开启新的进程,或者叫做java调用外部应用程序。这里的实现方式java提供了两个类:Process、RunTime。
                这些类之间的关系:
                1.通过ProcessBuilder 构建 Process 实例。
                2.通过RunTime构建Process实例。

                代码如下:

    //外部程序命令,这里是shell 脚本	
    String cmds[] = {"/bin/bash","-c","chmod -R 766 /opt/game_plugin/*"};
    //Process process1= Runtime.getRuntime().exec(cmds);
    		
    ProcessBuilder builder = new ProcessBuilder(cmds);
    Process process = builder.start();
    		
    while(process.isAlive()) {//判断进程是否还存活
    	Thread.sleep(1000);
    }
    System.out.println("进程退出值:"+process.exitValue());

    说明:

    1.在java 基本类库中用单词“Process” 标识“进程”。即,现实世界的“进程”在java 中定义为Process类,就像“颜色”为Color类。【java类,是现实世界里的事物在java 世界里找的对应事物

    2.由于创建的Process 实例没有终端或控制台,要与进程进行交互需要Process 提供的三种流:getInputStream,getOutPutSteam,getErrorStream。当然,Process还提供了其他与进程有关的方法。
    3.“-c”,上面代码java 调用的是liunx 下的shell 命令。-c 的意义是命令“/bin/bash”  的“选项 ” 是“chmod -R 766 /opt/game_plugin/*” 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • JAVA调用外部程序JAVA调用外部程序并截出程序运行结果
  • Java调用外部程序命令

    2012-02-28 16:11:58
    F:\Work\Study\功能点技术\java调用可执行文件\Java调用外部程序命令.doc
  • 通过Java运行一个外部程序 public class hpboot{ public static void main(String[] args) { String command = "C:\\Program Files\\Outlook Express\\msimn.exe"; try{ Runtime.getRuntime().exec(command);...
  • java调用外部程序的方法

    千次阅读 2017-04-10 17:18:33
    1 java调用外部程序的方法  在一个java应用中,可能会遇到这样的需求,就是需要调用一些外部的应用做一些处理,比如调用excel,然后在继续程序的运行。  下面就开始进入java调用外部程序的一些演示,让java应用...
  • 有时候,自己的 Java 应用会依赖一些外部程序,比如数据库,一些中间件,比如 redis,influxdb,等等。这样,就需要在 Java 应用启动时,检测这些外部程序的状态,如果这些程序没启动,就应该启动它们。 启动这些...
  • Java中使用Runtime和Process类运行外部程序 使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。  1.exec(String command)  2.exec(String command, String envp[], File dir)  3.exec...
  • Java 的 Runtime 调用exe 程序,调用windows自带的 记事本、计算器等都能正常打开; 但是用调用其它目录的exe文件就无反应了,运行也不报错。双击运行 send.exe 也可以正常运行。 代码如下: ``` public ...
  • 使用记事本编写运行Java程序

    千次阅读 2021-03-08 19:10:19
    经过上节的操作已经配置完了 Java 的开发环境,但并不清楚所配置的开发环境是否真的可以运行 Java 应用程序。为了解除这个疑虑,也为了使读者对开发 Java 应用程序的步骤有一个初步的了解,本节将展示一个完整 Java ...
  • 1.‘java’ 不是内部或外部命令,也不是可运行程序 或批处理文件。 出现这种情况一般来说是没有配置环境变量或者是没有配置好 (1)找到安装java的位置 (每个人的不一样 自己看看) (2)进入控制面板==》系统与...
  • import java.io.*; /** * 示例:执行进程并返回结果 */ public class ProcessExecutor { http://www.kmrlyy.com/fkzl/33576.html public static final int SUCCESS = 0; // 表示程序执行成功 public ...
  • 帅气的童鞋搭建Java开发环境在DOS窗口输入java和javac命令时,总是提醒:'java'不是内部或外部命令,也不是可运行程序或批处理文件 或者 'javac'不是内部或外部命令,也不是可运行程序或批处理文件。在多次反复...
  • java javac 不是内部或外部命令,也不是可运行程序 或批处理文件 更多资料请关注微信公众号 《java微课程》
  • JAVA调用外部程序阻塞问题

    千次阅读 2014-04-11 10:44:43
    前些天使用Java调用外部程序的时候,发现线程会堵塞在waitfor()方法。 调用方法如下: Process process = Runtime.getRuntime().exec(cmd); process.waitfor(); 如果直接在Shell中调用这个程序,...
  • Java中执行脚本命令以及调用外部程序说明 一、Java中关于ProcessBuilder 和 Runtime 类的介绍 在Java中要想调用脚本或者其他程序必须通过ProcessBuilder 和 Runtime 类,以上两个类任选一个就行,关于他们的介绍...
  • 今天在win10上安装了JDK-11,然后修改环境变量后在cmd运行java -version发现提示’java’ 不是内部或外部命令,也不是可运行程序或批处理文件。 开始以为是没有设置CLASSPATH,百度了才知道原来jdk6以后的版本都...
  • 有些同学安装JAVA以后,并且按照相关教程配置了环境变量,但是在cmd中输入 javac 却得到“不是内部或外部命令,也不是可运行程序或批处理文件”的提示,本文将解决这个问题。       ...
  • java命令行直接执行程序,如果这个程序需要引用外部jar包。就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac-cp D:\yy\yy.jar,D\xx\xx.jar test.java 执行 java -cp D:\yy\yy.jar,D\...
  • 解决方法: path里新建的路径分成两行写!(可以写成相对路径) ...%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (最前面的英文字符.不要忘了) JAVA_HOME=你电脑里jdk的绝对路径 ...
  • 第一是Java配置:是否下载jdk,jre即Java的开发工具和运行环境。 一般下载jdk时是自动携带下载jre的;位置在Program Files里面 如果一切下载安装没问题,那就是环境变量配置问题 第二种:选择属性打开,选择高级...
  • 程序如何一直保持运行的?

    千次阅读 2021-02-12 18:51:47
    问这个问题不知道大家会不会觉得提问者是个傻子(还请各位大佬轻喷 = =)......}运行这段代码的时候,程序开始运行--->控制台输出1--->程序结束,这段代码在运行完成之后就自动停止了,也就是说我可以...
  • java程序在windows系统作为服务运行

    千次阅读 2018-11-20 15:53:39
    场景:java程序打包成jar文件运行在服务器上时,一不小心就很容易把console窗口关闭了。为了避免这种情况,最好将java程序在服务器上作为一种系统上的服务来运行。 步骤:  1、下载wrapper-windows软件包,下载...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 329,341
精华内容 131,736
关键字:

java运行外部程序

java 订阅