java的Runtime环境已经是命令行模式,类似已经打开cmd.exe 所以,
执行后续命令无需加上 cmd.exe,命令修改为:
Runtime.getRuntime().exec("adb devices")
似乎是有可能配置 Java 2 Security 来做这件事,不过要知道配置这个文件是非常繁琐的事情,因为它相当于一个白名单,要把所有允许的都列出来,本来你只想禁用一个功能却需要列举很多种允许的事情,这会非常痛苦。你看是不是在 policytool 中除了 grant 之外还有 revoke 或 deny 之类的功能来设定黑名单。
比如可能导致 Java 反射这种平时允许的操作也无法正常工作。
在 JDK 目录下的 \bin 下面有一个 policytool 程序,启动它来创建你的 Java 2 Security Policy,然后在你的程序的命令行多加一个参数 -Djava.security.policy=你的policy文件路径(全名哦)
我觉得你设定这个 Java 程序启动时用指定的操作系统用户身份来运行可能更容易在操作系统方面控制它能访问什么程序,这样就算它执行了exec 也会被操作系统拦截的。
1 Runtime.getRuntime()返回Process对象2 Process对象拥有输入流和输出流
3 Process对象具有waitFor效应,命令有可能执行不成功!
4 先写入输入流,然后从Process里面读出输出命令即可。
5 以下是比较成功的方法,doc下面的命令几乎都能成功!
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStream
import java.io.OutputStreamWriter
import java.util.LinkedList
public class Command {
private java.lang.Process p
private InputStream is
private OutputStream os
private BufferedWriter bw
private BufferedReader br
private ProcessBuilder pb
private InputStream stdErr
public Command() {
}
//获取Process的输入,输出流
public void setCmd(String cmd) {
try {
p = Runtime.getRuntime().exec(cmd)
os = p.getOutputStream()
is = p.getInputStream()
stdErr = p.getErrorStream()
} catch (IOException e) {
System.err.println(e.getMessage())
}
}
//向Process输出命令
public void writeCmd(String cmd) {
try {
bw = new BufferedWriter(new OutputStreamWriter(os))
bw.write(cmd)
bw.newLine()
bw.flush()
bw.close()
} catch (Exception e) {
e.printStackTrace()
}
}
//读出Process执行的结果
public String readCmd() {
StringBuffer sb = new StringBuffer()
br = new BufferedReader(new InputStreamReader(is))
String buffer = null
try {
while ((buffer = br.readLine()) != null) {
sb.append(buffer + "\n")
}
System.out.println(p.waitFor())
} catch (Exception e) {
e.printStackTrace()
}
return sb.toString()
}
//将命令一股脑塞入list中
public LinkedList<String>doCmd(LinkedList<String>lists) {
LinkedList<String>list = new LinkedList<String>()
for (String s : lists) {
writeCmd(s)
list.add(readCmd())
}
return list
}
public static void main(String[] args) {
Command cmd = new Command()
cmd.setCmd("cmd")
cmd.writeCmd("copy d:\\stock.xml d:\\backStock.xml")
System.out.println(cmd.readCmd())
//LinkedList<String>list = new LinkedList<String>()
//list.add("dir/b")
//list = cmd.doCmd(list)
// for(String s:list){
// System.out.print(s)
// }
}
}