使用Runtime.exec重定向本地程序调用
2005-09-13 09:48
381 查看
Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么做才行。
程序样例:
String[] cmds = {"notepad.exe","readme.txt"};
Process ps = Runtime.getRuntime().exec(cmds);
下面是转载的(仅供参考)以下是一个简单类的范例,展示了在Unix下运行ls命令的情形:import java.io.BufferedInputStream;
import java.io.IOException;
public class ExecLs {
static public void main(String[] args) {
String cmd = "ls"
try {
Process ps = Runtime.getRuntime().exec(cmds);
System.out.print(loadStream(ps.getInputStream()));
System.err.print(loadStream(ps.getErrorStream()));
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while( (ptr = in.read()) != -1 ) {
buffer.append((char)ptr);
}
return buffer.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的限制。
程序样例:
String[] cmds = {"notepad.exe","readme.txt"};
Process ps = Runtime.getRuntime().exec(cmds);
下面是转载的(仅供参考)以下是一个简单类的范例,展示了在Unix下运行ls命令的情形:import java.io.BufferedInputStream;
import java.io.IOException;
public class ExecLs {
static public void main(String[] args) {
String cmd = "ls"
try {
Process ps = Runtime.getRuntime().exec(cmds);
System.out.print(loadStream(ps.getInputStream()));
System.err.print(loadStream(ps.getErrorStream()));
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
static String loadStream(InputStream in) throws IOException {
int ptr = 0;
in = new BufferedInputStream(in);
StringBuffer buffer = new StringBuffer();
while( (ptr = in.read()) != -1 ) {
buffer.append((char)ptr);
}
return buffer.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的限制。
相关文章推荐
- Java技巧:使用Runtime.exec重定向本地程序Java技巧:使用Runtime.exec重定向本地程序调用调用
- 使用Runtime.getRuntime().exec()的方法调用本地mysqldump.exe备份还原数据库(路径中含有空格和数字)的方法
- java程序中调用其他工具打开文本---Runtime.getRuntime().exec()的使用
- 使用java调用本地EXE程序
- 使用Java中的Process类调用本地程序
- 使用Runtime.getRuntime().exec()在java中调用python脚本
- 在runtime.getruntime().exec调用程序时路径的问题的解决方案列表
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- MAC(苹果)-JAVA Runtime.exec调用 .app 程序
- 用Runtime.getRuntime().exec()调用外部程序.
- 使用Runtime.getRuntime().exec()在java中调用python脚本
- 使用java调用本地exe程序和cmd程序
- Runtime.getRuntime().exec()实现Java调用python程序
- Java 使用Runtime.getRuntime.exec 和 ProcessBuilder 调用外部命令
- 使用Intent调用系统其它程序打开本地各种类型的文件
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- Eclipse下使用Runtime.getRuntime().exec启动java程序的问题
- html中使用javascript调用本地程序(exe、doc等)实现代码