我需要从 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, Argument list too long
我尝试使用 echo 代替,如下所示
echo <<InputMessage>> | 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 http://www.javaworld.com/jw-12-2000/jw-1229-traps.html Apache 公共执行器 http://commons.apache.org/proper/commons-exec/帮助您处理其中的一些问题。
另一方面,你为什么使用 iconv?您知道 Java 对大多数字符编码都有良好的库支持,cp930
包括?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)