Java 如何实现 系统调用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 如何实现 系统调用?相关的知识,希望对你有一定的参考价值。

N久没碰代码..毕业设计不得已重操旧业...

我们的题目要求,是分别在Win和Linux下实现 远程关机,搜集并汇报本地资源信息(OS 版本,CPU信息,磁盘信息,以及其他设备信息等等)。

网络模块已经做好,现在的问题就是,如何能够用Java实现上述操作?

要求:说明 所使用的类库,最好能够提供相关API文档的下载地址
一楼请说中文

通过 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 www.baidu.com";
执行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 www.baidu.com";

//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();


参考技术A   
  Java 实现系统调用方式诸多,根据各个开发商以及目标规范要求有所不同,就算是同一个集团内部(如电信、移动)都可以说是百花齐放,一般交互方式有:
  1、URL、SESSION、COOKIE、隐藏域数据COMMIT;
  2、WEBSERVICE;
  3、EJB;
  4、Socket;
  5、接口数据、MQ消息传递等;
参考技术B import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* 远程(本地)调用系统关机命令
* gpedit.msc的”windows设置--〉安全设置--〉用户权利指派“中指派guest具有“从远端系统强制关机”权限
*/

public class ControlCMD

//Runtime
public void execute(String command)

try
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line=reader.readLine())!=null)
System.out.println("命 令 行: "+command);
System.out.println("报错信息: "+line);
catch (IOException e)
System.out.println("远程命令 执行失败!!!");
e.printStackTrace();



//指定远程客户机ip,立即关机
public void shutdown(String ip)
execute("shutdown -s -m \\\\"+ip);


//指定远程客户机ip,延时 i 秒关机
public void shutdown(String ip,int i)
execute("shutdown -s -m \\\\"+ip+" -t "+i);


//指定远程客户机ip,延时 i 秒重新启动
public void restart(String ip,int i)
execute("shutdown -r -m \\\\"+ip+" -t "+i);


//以下的程序主方法用于测试
public static void main(String [] args)
ControlCMD ccmd = new ControlCMD();

// ccmd.shutdown("192.168.1.2",10);

ccmd.restart("192.168.1.2", 10);


本回答被提问者采纳

以上是关于Java 如何实现 系统调用?的主要内容,如果未能解决你的问题,请参考以下文章

java做投票系统

java 22 - 4 多线程的代码实现的方式1

Java中的用户程序如何进行系统调用/调用内核子程序?

如何提供接口给外部系统调用?

Java如何调用本地dll库里面的方法

java调用kettle_实现