「java调用系统命令函数」java 调用系统命令

博主:adminadmin 2023-01-01 23:42:06 648

今天给各位分享java调用系统命令函数的知识,其中也会对java 调用系统命令进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何利用java过程执行操作系统命令

import java.io.InputStream;

import java.util.ArrayList;

public class JavaExcCommand {

private static String INPUT_STREAM = "INPUTSTREAM";

private static String ERROR_STREAM = "ERRORSTREAM";

/**

* 返回命令执行结果信息串

* @param command 要执行的命令

* @return 第一个为标准信息,第二个为错误信息,如果不存在则相应为空

* @throws Throwable String[]

*/

public static String[] exec(String command) throws Throwable {

Process process = null;

Runtime runtime = Runtime.getRuntime();

String osName = System.getProperty("os.name").toLowerCase();

if (osName.indexOf("windows 9") -1) {

process = runtime.exec("command.com /c " + command);

} else if ((osName.indexOf("nt") -1)

|| (osName.indexOf("windows 20") -1)

|| (osName.indexOf("windows xp") -1 || (osName.indexOf("windows vista") -1))) {

/*

* 开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS窗口,使用cmd /?查看帮助

*/

process = runtime.exec("cmd.exe /c " + command);

} else {

// Linux,Unix

process = runtime.exec(command);

}

//存储返回结果,第一个为标准信息,第二个为错误信息

String result[] = new String[2];

Object mutexInstream = new Object();

Object mutexErrorstream = new Object();

new ReadThread(process.getInputStream(), INPUT_STREAM, result, mutexInstream)

.start();

new ReadThread(process.getErrorStream(), ERROR_STREAM, result, mutexErrorstream)

.start();

//确保子线程已启动

Thread.sleep(20);

/*

* 这里一定要等标准流与错误都读完了后才能继续执行后面的代码,否则外面引用返回的结果可能

* 为null或空串,所以要等两个线程执行完,这里确保读取的结果已返回。在读取时使用了两个线

* 程,因为发现在一个线程里读这种流时,有时会阻塞,比如代码实现时先读取标准流,而运行时

* 命令却执行失败,这时读标准流的动作会阻塞,导致程序最终挂起,先读错误流时如果执行时成

* 功,这时又可能挂起。还有一个问题就是即使使用两个线程分别读取流,如果不使用同步锁时,也

* 会有问题:主线程读不到子线程返回的数据,这主要是由于主线读取时子线还没未返回读取到的信

* 息,又因为两个读线程不能互斥,但又要与主线程同步,所以使用了两个同步锁,这样两个线程谁

* 先执行互不影响,而且主线程阻塞直到标准信息与错误信息都返回为止

*/

synchronized (mutexInstream) {

synchronized (mutexErrorstream) {

/*

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

* 。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被

* 阻塞,直到退出子进程。

* process.waitFor()目的是等待子进程完成后再往下执行,不过这里好像没有什么

* 太大的作用除了用来判断返回的状态码外,因为如果程序进到这里表示子线程已执行完

* 毕,process子进程理所当然的也已执行完毕,如果子进程process未执行完,我想

* 读流的操作肯定会阻塞的。

*

* 另外,使用process.waitFor()要注的是一定不要在数据流读取前使用,否则线程

* 也会挂起,导致该现象的原因可能是该命令的输内容出比较多,而运行窗口的输出缓冲

* 区不够大,最后没不能写缓冲引起,所以这里先使用了两个单独的线程去读,这样不管

* 数据量有多大,都不会阻塞了。

*/

if (process.waitFor() != 0) {

result[0] = null;

} else {

result[1] = null;

}

}

}

return result;

}

public static void main(String args[]) throws Throwable {

if (args.length == 0) {

System.out.println("Useage: \r\n java JavaExcCommand command");

return;

}

String[] result = JavaExcCommand.exec(args[0]);

System.out.println("error info:---------------\r\n" + result[1]);

System.out.println("std info:-----------------\r\n" + result[0]);

}

/*

* 标准流与错误流读取线程

*/

private static class ReadThread extends Thread {

private InputStream is;

private String[] resultArr;

private String type;

private Object mutex;

public ReadThread(InputStream is, String type, String[] resultArr, Object mutex) {

this.is = is;

this.type = type;

this.resultArr = resultArr;

this.mutex = mutex;

}

public void run() {

synchronized (mutex) {

try {

int readInt = is.read();

ArrayList result = new ArrayList();

/*

* 这里读取时我们不要使用字符流与缓冲流,发现执行某些命令时会阻塞,不

* 知道是什么原因。所有这里使用了最原始的流来操作,就不会出现问题。

*/

while (readInt != -1) {

result.add(Byte.valueOf(String.valueOf((byte) readInt)));

readInt = is.read();

}

byte[] byteArr = new byte[result.size()];

for (int i = 0; i result.size(); i++) {

byteArr[i] = ((Byte) result.get(i)).byteValue();

}

if (ERROR_STREAM.equals(this.type)) {

resultArr[1] = new String(byteArr);

} else {

resultArr[0] = new String(byteArr);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

}

比如传递一个参数为 dir/w ,运行结果如下:

error info:---------------

null

std info:-----------------

驱动器 E 中的卷是 Work

卷的序列号是 9876-AE7E

E:\_\Test 的目录

[.] [..] .classpath .project [bin] [lib]

[src]

2 个文件 904 字节

5 个目录 5,636,612,096 可用字节

如果传一个不存在的命令 aaa ,结果如下:

error info:---------------

'aaa' 不是内部或外部命令,也不是可运行的程序

或批处理文件。

std info:-----------------

null

最后来一个查看操作系统的环境变量,注,这里不是使用的System.getXX来获取的,这是Java虚拟机设置的,我们这里是操作系统所设环境变量,如在window上输出 set ,或在 Linux 上输入 env ,window上运行的结果如下:

error info:---------------

null

std info:-----------------

ALLUSERSPROFILE=C:\ProgramData

APPDATA=C:\Users\jiangzhengjun\AppData\Roaming

classpath=D:\java\jdk1.5.0_17/lib;.

CommonProgramFiles=C:\Program Files\Common Files

COMPUTERNAME=JZJ-PC

ComSpec=C:\Windows\system32\cmd.exe

FP_NO_HOST_CHECK=NO

HOMEDRIVE=C:

HOMEPATH=\Users\jiangzhengjun

java_home=D:\java\jdk1.5.0_17

LOCALAPPDATA=C:\Users\jiangzhengjun\AppData\Local

LOGONSERVER=\\JZJ-PC

NUMBER_OF_PROCESSORS=2

OS=Windows_NT

Path=D:\java\jdk1.5.0_17/bin\..\jre\bin\client;D:\java\jdk1.5.0_17/bin\..\jre\bin;D:\java\jdk1.5.0_17/bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;C:\Program Files\Broadcom\Broadcom 802.11\Driver

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

PROCESSOR_ARCHITECTURE=x86

PROCESSOR_IDENTIFIER=x86 Family 6 Model 23 Stepping 6, GenuineIntel

PROCESSOR_LEVEL=6

PROCESSOR_REVISION=1706

ProgramData=C:\ProgramData

ProgramFiles=C:\Program Files

PROMPT=$P$G

PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

PUBLIC=C:\Users\Public

SESSIONNAME=Console

SystemDrive=C:

SystemRoot=C:\Windows

TEMP=C:\Users\JIANGZ~1\AppData\Local\Temp

TMP=C:\Users\JIANGZ~1\AppData\Local\Temp

USERDOMAIN=jzj-pc

USERNAME=jiangzhengjun

USERPROFILE=C:\Users\jiangzhengjun

windir=C:\Windows

今天作项目时发现了一个简洁一点的办法:

Java代码

import java.io.InputStream;

import java.util.ArrayList;

public class JavaExcCommand {

/**

* 返回命令执行结果信息串

*

* @param command

* 要执行的命令

* @return 第一个为标准信息,第二个为错误信息

* @throws Throwable

* String[]

*/

public static String[] exec(String command) throws Throwable {

Process process = null;

Runtime runtime = Runtime.getRuntime();

// Linux,Unix

process = runtime.exec(command);

// 存储返回结果,第一个为标准信息,第二个为错误信息

String result[] = new String[2];

ReadThread inputReadThread = new ReadThread(process.getInputStream());

ReadThread errReadThread = new ReadThread(process.getErrorStream());

inputReadThread.start();

errReadThread.start();

//确保标准与错误流都读完时才向外界返回执行结果

while (true) {

if (inputReadThread.flag errReadThread.flag) {

break;

} else {

Thread.sleep(1000);

}

}

result[0] = inputReadThread.getResult();

result[1] = errReadThread.getResult();

return result;

}

public static void main(String args[]) throws Throwable {

if (args.length == 0) {

System.out.println("Useage: \r\n java JavaExcCommand command");

return;

}

String[] result = JavaExcCommand.exec(args[0]);

System.out.println("error info:---------------\r\n" + result[1]);

System.out.println("std info:-----------------\r\n" + result[0]);

}

/*

* 标准流与错误流读取线程

*/

private static class ReadThread extends Thread {

private InputStream is;

private ArrayList result = new ArrayList();

public boolean flag;// 流是否读取完毕

public ReadThread(InputStream is) {

this.is = is;

}

// 获取命令执行后输出信息,如果没有则返回空""字符串

protected String getResult() {

byte[] byteArr = new byte[result.size()];

for (int i = 0; i result.size(); i++) {

byteArr[i] = ((Byte) result.get(i)).byteValue();

}

return new String(byteArr);

}

public void run() {

try {

int readInt = is.read();

while (readInt != -1) {

result.add(Byte.valueOf(String.valueOf((byte) readInt)));

readInt = is.read();

}

flag = true;// 流已读完

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

java如何调用windows的命令?

1、执行DOS的内部命令

如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上, 可写成exec("cmd.exe /c dir"),在windows 95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。

2、打开一个不可执行的文件

打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。 以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:

exec("start .\\a.doc");

exec(" c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc");

显然,前一种方法更为简捷方便。

3、执行一个有标准输出的DOS可执行程序

在windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:

...

String ls_1;

Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");

BufferedReader bufferedReader = new BufferedReader( \

new InputStreamReader(process.getInputStream());

while ( (ls_1=bufferedReader.readLine()) != null)

System.out.println(ls_1);

process.waitfor( );

...

java程序里调用linux命令

1.Java调用shell

Java语言以其跨平台性和简易性而著称,在Java里面的lang包里(java.lang.Runtime)提供了一个允许Java程序与该程序所运

行的环境交互的接口,这就是Runtime类,在Runtime类里提供了获取当前运行环境的接口。

其中的exec函数返回一个执行shell命令的子进程。exec函数的具体实现形式有以下几种:

public Process exec(String command) throws IOException

public Process exec(String command,String[] envp) throws

IOException

public Process exec(String command,String[] envp,File dir) throws

IOException

public Process exec(String[] cmdarray) throws IOException

public Process exec(String[] cmdarray, String[] envp) throws

IOException

public Process exec(String[] cmdarray, String[] envp,File dir)

throws IOException

我们在这里主要用到的是第一个和第四个函数,具体方法很简单,就是在exec函数中传递一个代表命令的字符串。exec函数返回的是一个Process类

型的类的实例。Process类主要用来控制进程,获取进程信息等作用。(具体信息及其用法请参看Java doc)。

1)执行简单的命令的方法:

代码如下:

上面的代码首先是声明了一个代表命令的字符串commands,它代表了ls -l

这个命令。之后我们用Runtime.getRuntime().exec(commands)来生成一个子进程来执行这个命令,如果这句话运行成功,则

命令 ls -l 运行成功(由于没有让它显示,不会显示ls -l

的结果)。后面的流操作则是获取进程的流信息,并把它们一行行输出到屏幕。2)执行带有参数的命令(尤其是参数需要用引号的)时则需要用String的数组来表示整个命令,而且要用转义符把引号的特殊含义去除,例如我们要执行

find / -name "*mysql*" -print 时,用如下代码

Java 可以通过 Runtime 调用Linux命令,形式如下:

Runtime.getRuntime().exec(command)

但是这样执行时没有任何输出,因为调用 Runtime.exec 方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例)该实例可用于控制进程或取得进程的相关信息。

由于调用 Runtime.exec 方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向给它的父进程了。

用户需要用这些stream来向子进程输入数据或获取子进程的输出,下面的代码可以取到 linux 命令的执行结果:

Java 如何实现 系统调用?

通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过。基本原理是,首先通过 Runtime.getRuntime() 返回与当前 Java 应用程序相关的运行时对象,然后调用run.exec(cmd) 另启一个进程来执行命令(cmd为要执行的命令)。

一、运行一个可执行程序

执行一个.exe的文件,或通过已安装的软件打开一个特定格式的文件,如word、chm或mp3等等。

1. 在window下可以直接执行一个.exe文件,如执行我在F盘下的tomcat安装文件,将命令写为:

String cmd = "F:\\apache-tomcat-6.0.20.exe";

2. 打开一个word文档。如果系统已经安装了office应用程序,就可以通过调用word的可执行程序来打开一个word文档:

String cmd = "D:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE F:\\test.doc";

当然这样写有点麻烦,我们想打开一个word文档时只要双击就可以了,用不着去找WINWORD.EXE。要是打开每一种格式的文件都得去找它的可执行程序,那可累死了,我们可以通过下面的代码,打开任意一个已知格式的文件(只要安装的打开这种文件格式的软件),相当于用鼠标双击一个文件的图标:

String cmd = "cmd.exe /c start F:\\test.doc";

我用C写了一个进程操作的小例子,放在 linux 下编译出的可执行文件叫“fork_wait”,然后把我的java文件编译成TestRunTime.class后扔到 linux 上,在控制台执行 java TestRunTime 命令,TestRunTime 和 fork_wait 程序均运行成功。

String cmd = "./fork_wait";

二、执行一个有标准输出的系统命令

通过调用进程的 getInputStream() 方法,可以获得执行命令的标准输出。在 windows 的cmd控制台窗口和 linux 控制台执行系统名利的格式是一样的,只是输入的命令不同而已。

如要执行windows控制台中ping命令,可写为:String cmd = "ping ";

执行linux的ls命令,可写为:String cmd = "ls -l";

如果要执行一个带参数的命令,可使用 String 数组形式,如:

String[] cmd=new String[3];

cmd[0]="/bin/sh";

cmd[1]="-c";

cmd[2]="ls -l ./";

下面是我写的小例子:

Java代码

package com.why.RunTime;

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class TestRunTime {

public static void main(String[] args) {

//windows

// String cmd = "F:\\apache-tomcat-6.0.20.exe";

// String cmd = "D:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE F:\\test.doc";

// String cmd = "cmd.exe /c start F:\\test.doc";

String cmd = "ping ";

//linux

// String cmd = "./fork_wait";

// String cmd = "ls -l";

// String[] cmd=new String[3];

// cmd[0]="/bin/sh";

// cmd[1]="-c";

// cmd[2]="ls -l ./";

Runtime run = Runtime.getRuntime();//返回与当前 Java 应用程序相关的运行时对象

try {

Process p = run.exec(cmd);// 启动另一个进程来执行命令

BufferedInputStream in = new BufferedInputStream(p.getInputStream());

BufferedReader inBr = new BufferedReader(new InputStreamReader(in));

String lineStr;

while ((lineStr = inBr.readLine()) != null)

//获得命令执行后在控制台的输出信息

System.out.println(lineStr);// 打印输出信息

//检查命令是否执行失败。

if (p.waitFor() != 0) {

if (p.exitValue() == 1)//p.exitValue()==0表示正常结束,1:非正常结束

System.err.println("命令执行失败!");

}

inBr.close();

in.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

java调用系统命令函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 调用系统命令、java调用系统命令函数的信息别忘了在本站进行查找喔。