Java – “bash”:java.io.IOException:error = 7,参数列表太长

我有一个要求从Java调用Unix命令

代码如下

String strCmd = "iconv -f "+ strSrcEncoding+" -t "+ strTgtEncoding + " <<< "+"\""+InputMessage+"\""; String commands[] = {"bash","-c",strCmd}; Process proc = Runtime.getRuntime().exec(commands); String strData = null; // Get the error Stream BufferedReader brStdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); StringBuilder sbError = new StringBuilder(); // read any errors from the attempted command while ((strData = brStdError.readLine()) != null) { sbError.append(strData); } if(sbError.toString().isEmpty()) return "success"; else return "failure"+sbError.toString(); 

当我传递一个大数据时出错

“bash”:java.io.IOException:error = 7,参数列表太长

我试着使用echo来代替echo <> | iconv -f utf8 -t Cp930

但是得到相同的错误

我错过了什么?

在命令行上可以传递给程序的数据量有限。 如果你有很多数据,你应该使用它的标准输入流将它传递给iconv,也就是将它写入proc.getOutputStream 。 这是一个例子:

 OutputStream os = proc.getOutputStream(); os.write(InputMessage.getBytes(strSrcEncoding)); os.close(); 

不幸的是,对于更长的消息,这也将失败,因为iconv将填充它所连接的管道的缓冲区,并等待管道被读取。 解决方案是从一个线程向iconv写入数据,并从另一个线程读取输出。 由于所有这些陷阱,处理外部过程是一件麻烦事。 您可以在这里阅读更多关于它的信息: http : //www.javaworld.com/jw-12-2000/jw-1229-traps.html Apache commons exec可以帮助您处理其中的一些问题。

另一方面,你为什么使用iconv? 你知道Java对大多数字符编码有很好的支持,包括cp930

尝试设置环境变量时遇到此问题,如下所示:

 final ProcessBuilder pb = new ProcessBuilder(...); pb.environment().putAll(env); //here it's ok ... pb.start(); //here is where it throws the exception 

问题是什么env地图包含,虽然"bash":java.io.IOException: error=7, Argument list too long ,否则指示。

发生这种情况时,参数的大小超过了允许的大小。 这取决于平台。

要验证最大限制,请运行

 $ getconf ARG_MAX 

对于mac osx环境,我可以看到262144是极限。

每个平台的限制是不同的,可以在这里找到: http : //www.in-ulm.de/~mascheck/various/argmax/

检查环境字符串:

 $env