转自:http://huajianhsiu.iteye.com/blog/1772775
使用sh -c , 不然会报 can not create Process error =2的错误!
一、Runtime.getRuntime().exec()执行命令情况:
Runtime.getRuntime().exec("cmd /c your command")//2000
Runtime.getRuntime().exec("command /c your command")//98
Runtime.getRuntime().exec("sh/ your command")//linux
二、执行.sh文件的情况:
1、把命令写成a.sh ;执行命令的时候
Process child = Runtime.getRuntime().exec("bash a.sh,null,new File("//usr/local/mysql/bin/"));
child.waitFor();
........
2、Process child = Runtime.getRuntime().
exec(new String[] {"/bin/sh","-c","mysqldump
-u root -p7788919 axtic_cg" },
null,
new File("/usr/local/mysql/bin/"));
child.waitFor();
注:waitFor()等待操作完成
Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么做才行。
以下是一个简单类的范例,展示了在Unix下运行ls命令的情形:
-
importjava.io.BufferedInputStream;
-
importjava.io.IOException;
-
-
publicclassExecLs{
-
-
staticpublicvoidmain(String[]args){
-
Stringcmd="ls"
-
-
try{
-
Processps=Runtime.getRuntime().exec(cmds);
-
System.out.print(loadStream(ps.getInputStream()));
-
System.err.print(loadStream(ps.getErrorStream()));
-
}catch(IOExceptionioe){
-
ioe.printStackTrace();
-
}
-
}
-
-
-
staticStringloadStream(InputStreamin)throwsIOException{
-
intptr=0;
-
in=newBufferedInputStream(in);
-
StringBufferbuffer=newStringBuffer();
-
while((ptr=in.read())!=-1){
-
buffer.append((char)ptr);
-
}
-
returnbuffer.toString();
-
-
-
-
-
-
}
-
-
}
上述代码中重要的部分是exec方法和命令字符串ls。本程序将输出运行目录下的列表细节。 那么,如果你想重定向这些细节内容到文件该怎么办?这一命令行的输入应该写成ls > FILE,但是当你将cmd变量改变成这样的话,运行就会出错,如下: /bin/ls: >: No such file or directory /bin/ls: FILE: No such file or directory 出错的原因在于额外的参数被直接传送到了ls命令而不是送到实际的命令行。解决这一问题的办法是将cmd串弄成一个字符串数组,并且将你想运行的程序传送到命令shell。 因此,将cmd行改成下面的样子: String[] cmd = { "sh", "-c", "ls > FILE" }; 你将得到一个名为FILE的文件,里面是目录列表。-c参数是告诉它读取随后的字符串,而最后的参数是你要运行的脚本。 在这种情况下,管道也运行良好,所以你可以把命令改成下面的方式: String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE" }; 这种形式将给你一个名为FILE的文件,里面是ls条目中包含d的条目。给出sh和ls的全路径有利于提供你的程序的安全性。 虽然使用Runtime.exec不是创建独立于平台的Java的最佳方式,但是有些时候是必要的。使用这种重定向技术有助于走出Runtime.exec的限制。说明:
-
1.exec的必须是可执行的程序,如果是命令行的命令则还需另外处理
-
2.在windows中process=runtime.exec(newString[]{"cmd.exe","/C","dir"});
-
3.在linux中process=runtime.exec(newString[]{"/bin/sh","-c","echo$PATH"});
分享到:
相关推荐
`Runtime.exec()`是最为传统且简单的执行外部程序的方法。它可以启动一个新的进程,并返回一个代表该进程的`Process`对象。但是,这种方法在处理进程的输入/输出流时存在一定的局限性。 **代码示例** ```java ...
另一个类`Shell.java`可能是用来封装命令执行逻辑的。例如,它可能包含一个方法,接收命令字符串或命令数组,然后使用`Runtime.exec`执行命令。这样的封装可以使代码更整洁,易于复用。 然而,执行shell脚本时,...
通过以上介绍,我们不仅了解了如何在Java程序中调用Linux命令的基本原理,还学习了如何通过`Runtime.exec()`方法创建子进程以及如何控制这些子进程。这对于开发需要与操作系统交互的应用程序是非常有用的。
`exec()`方法返回一个`Process`对象,该对象可以用来获取命令执行的状态,读取输出流等。 二、ProcessBuilder类 `ProcessBuilder`类提供了更灵活的方式来执行命令,可以设置环境变量,工作目录等。创建`...
然而,在Java中通过`Runtime.getRuntime().exec()`或`ProcessBuilder`执行命令时,可能还会遇到问题,因为这些方法在处理命令行参数时有自己的规则。在某些情况下,即使在DOS窗口中可以成功执行的命令,通过Java执行...
Java通过Java Native Interface (JNI) 或者使用Runtime.exec() 方法可以与Linux系统进行交互,执行操作系统级别的命令。这种方式允许Java程序运行shell命令,如将一个文件转换成另一种格式。 2. **Apache POI**: ...
另外,虽然可以直接使用`Runtime.exec()`执行单条命令,但更推荐的方法是编写一个bat(Windows)或shell(Linux)脚本,将一系列命令封装在一起,然后通过Java执行这个脚本。这样可以更好地组织和管理复杂的命令序列...
这个函数接受命令行参数数组,执行命令,读取并打印标准输出,等待命令执行完成,然后返回退出状态码。 总的来说,在Linux系统下用Java执行系统命令需要注意命令的正确构造,特别是在处理通配符和交互式命令时。...
总结一下,Java调用本地浏览器的关键在于使用`Runtime.exec()`或`ProcessBuilder`执行操作系统级别的命令。具体命令取决于操作系统的类型,如Windows的`rundll32`,Linux的`xdg-open`,以及Mac OS的`open`。通过`...
- 考虑命令执行的权限问题,确保Java应用有足够的权限执行所需命令。 - 在生产环境中,应监控命令执行的结果,以确保服务的稳定性和可用性。 通过以上内容,你已经了解了如何使用Java调用Linux命令,以及如何在...
Apache Commons Exec库提供了一个更高级的API,可以更方便地处理命令执行,如重定向输入、输出和错误流,处理复杂的命令行构造等。 8. **与Shell脚本结合** 有时,单个命令无法满足需求,这时可以编写Shell脚本,...
我们可以使用 Java 的 Runtime.getRuntime().exec() 方法来执行 ipconfig 命令,并将结果解析出来获取网卡物理地址。下面是一个示例代码: ```java public final static String getMacAddress() throws IOException ...
在Java中,我们可以通过`Runtime.exec()`或`ProcessBuilder`类来执行这样的系统命令。 首先,让我们详细了解一下`Runtime.exec()`方法。这个方法允许Java程序在运行时执行外部程序或命令。例如,如果我们要在CMD中...
Java语言在执行外部程序或与操作系统交互时,通常会用到`java.lang.Runtime`类。这个类提供了运行时环境的接口,允许Java程序执行系统命令。然而,直接使用`Runtime`类进行命令行操作可能会比较繁琐,需要处理进程的...
### Java调用播放器知识点详解 #### 一、概述 ...通过上述内容,我们可以了解到如何在Java中使用`Runtime.exec()`方法来调用播放器以及执行其他系统命令。这对于开发具有多媒体功能的应用程序非常有用。
以上就是使用Java执行本地CMD命令以及通过SSH连接远程Linux服务器执行shell命令的方法。这两个功能的结合,使开发者能够轻松地在不同的操作系统间进行跨平台的系统操作,极大地提高了开发和运维的效率。
在Java编程中,有时我们需要与操作系统进行交互,例如在服务器端执行系统命令,这通常通过Java的`Runtime.getRuntime().exec()`或`ProcessBuilder`类来实现。在这个特定的问题"Java调用Linux CentOS系统安装的...
可以使用`Process`对象的`getErrorStream()`方法来获取命令执行时产生的错误输出,并对其进行处理。 ```java BufferedReader err = new BufferedReader(new InputStreamReader(p2.getErrorStream())); String error...
- 对于Windows平台,使用`attrib`命令时,确保路径中包含的空格被正确引用,避免命令执行错误。 - 在实际应用中,还需要考虑异常处理机制,以确保程序的健壮性。 #### 五、示例代码 下面是一个简单的示例代码,...
2. 使用`Runtime.getRuntime().exec()`方法执行系统命令。 以下是在Windows系统中使用`rundll32.exe`的示例: ```java import java.lang.Runtime; public class OpenBrowser { public static void main(String[] ...