java Runtime.exec 异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Runtime.exec 异常相关的知识,希望对你有一定的参考价值。

java 使用Runtime.exec调用插件异常
java.io.IOException: error=12, Cannot allocate memory
内存不足,
请问我该修改哪个内存?是toncat的运行内存 还是 服务器的总内存

参考技术A 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);
//

使用 Java Runtime.exec() 在 Hadoop 上运行命令

【中文标题】使用 Java Runtime.exec() 在 Hadoop 上运行命令【英文标题】:Running commands on Hadoop using Java Runtime.exec() 【发布时间】:2012-11-06 00:06:54 【问题描述】:

有一个名为“cufflinks”的程序运行如下:

cufflinks -o <output-dir>  <input-file>

此程序将 1 个文件作为输入,并在“输出目录”中生成 4 个文件作为输出。

我正在尝试使用映射器类中的 Runtime.exec() 在 Hadoop 集群上运行相同的程序。我正在设置

output-dir=/some/path/on/HDFS

我期待这 4 个文件将在 HDFS 上生成为 o/p。但是,事实并非如此,HDFS 上的 o/p 目录不包含这 4 个文件中的任何一个。

然后我尝试设置

输出目录=/tmp/output/

它成功了。

谁能建议为什么它不能在 HDFS 上运行?我需要做什么才能使其在 HDFS 上运行?

谢谢。

【问题讨论】:

【参考方案1】:

问题是袖扣程序应该使用 HDFS API 内部在 HDFS 中创建文件,而不是常规文件操作。

【讨论】:

嗯,这就是问题所在。但是,我的印象是,一旦您在 Hadoop 上使用 Runtime.exec() 运行程序,Hadoop 框架会将 HDFS 视为常规文件系统,并将像在常规文件系统上一样在 HDFS 上创建文件。那么,没有办法吗? HDFS 是分布式文件系统,而 NTFS/FAT/EXT* 不是,每个系统都有不同的 API 与它们交互。

以上是关于java Runtime.exec 异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Runtime.exec 从 Java 应用程序启动 JVM 进程?

(Java) Runtime.exec 中的文件重定向(双向)?

Java Runtime.exec()的使用

Java Runtime.exec

使用 Java 的 Runtime.exec() 时如何添加超时值?

java.lang.Runtime.exec() Payload