java Runtime、Process类,可以调用外部命令,主要方法是:
Runtime:
1.没有构造函数,只有这个静态方法 :public static Runtime getRuntime()返回与当前 Java 应用程序相关的运行时对象
2.执行外部命令,传递字符串参数,返回Process类:
public Process exec(String command)throws IOException在单独的进程中执行指定的字符串命令
Process:
1.获取子进程的错误流:
public abstract InputStream getErrorStream();
获取子进程的错误流,错误流获得由该 Process 对象表示的进程的错误输出流传送的数据。
2.获取子进程的输入流:
public abstract InputStream getInputStream();
获取子进程的输入流,输入流获得由该 Process 对象表示的进程的标准输出流。
例子:
1->打开一个记事本程序:
Runtime runtime = Runtime.getRuntime();
runtime.exec("notepad");//打开一个记事本
2->关机操作:
Runtime runtime = Runtime.getRuntime();
runtime.exec("shutdown -s");//关机
3->运行cmd操作,为了立即关闭cmd窗口,写法应该是:cmd /c cmd命令,或者把批命令写在一个bat文件里,进行调用批命令
a):调用cmd命令,获取调用的输入流,并输出:cmd dir
Runtime runtime = Runtime.getRuntime();
runtime.exec("cmd /c dir");
InputStream input = process.getInputStream();
BufferedReader buffered = new BufferedReader(new InputStreamReader(input));
String str;
while((str=buffered.readLine())!=null){
System.out.println(str);
}
b):调用cmd命令,获取调用的错误输入流,并输出:cmd 错误指令
Runtime runtime = Runtime.getRuntime();
runtime.exec("cmd /c test");
InputStream input = process.getErrorStream();
BufferedReader buffered = new BufferedReader(new InputStreamReader(input));
String str;
while((str=buffered.readLine())!=null){
System.out.println(str);
}
c)'综合下:调用javac 编译一个java文件
public static void test(String fileName)throws Exception{
Runtime runtime = Runtime.getRuntime();//创建runtime实例
Process process = runtime.exec("javac "+fileName);
InputStream errStream = process.getErrorStream();//错误流
InputStream inputStream = process.getInputStream();//输入流
//封装下
BufferedReader errReader = new BufferedReader(new InputStreamReader(errStream));
BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream));
String str;
//把信息纪录到文件里
File errfile = new File("errFile.txt");
File inputfile = new File("inputFile.txt");
BufferedWriter errWrite = new BufferedWriter(new FileWriter(errfile));
BufferedWriter inputWriter = new BufferedWriter(new FileWriter(inputfile));
while((str=errReader.readLine())!=null){
System.out.println(str);
errWrite.write(str);
errWrite.newLine();
errWrite.flush();
}
while((str=inputReader.readLine())!=null){
System.out.println(str);
inputWriter.write(str);
inputWriter.newLine();
inputWriter.flush();
}
//不要忘了关闭
errReader.close();
inputReader.close();
errWrite.close();
inputWriter.close();
}
注释:如果调用java命令时,在同一目录下有已编译好的class文件,只需传递文件名,不需路径信息