我想将一个大的csv文件从gb2312编码转换为UTF-8编码。 这是我使用的代码:
Process process = Runtime.getRuntime().exec(
String.format("iconv -c -f %1$s -t %2$s %3$s > %4$s",
sourceEncoding, targetEncoding, source, target));
process.waitFor();
问题是proccess.waitFor()方法永远不会结束。看起来iconv正在等待我的输入,比如从命令行调用它并且不给出args。但是从终端的另一个会话。我可以看到iconv运行正确的参数。
root 16729 0.0 0.1 164076 812 pts/0 S+ 23:00 0:00 iconv -c -f gb2312 -t utf-8 20110525.csv > 20110525.utf8.csv
如果我从终端手动输入命令,“iconv -c -f gb2312 -t utf-8 20110525.csv> 20110525.utf8.csv”命令正常工作。但是,如果我从java调用它,它就不起作用。
我调用iconv的双向启动目录具有相同的启动目录。
答案 0 :(得分:3)
正如MByD所说,重定向标志是一个shell功能。
但是,不是抓住OutputStream而是从Java执行bash:
... .exec("bash -c 'iconv -c -f gb2312 -t utf-8 20110525.csv > 20110525.utf8.csv'")
答案 1 :(得分:2)
重定向符号(>
)是shell / cmd功能,而不是java,从java执行进程时不能使用它。
您可以获取进程的OutputStream(InputStream is = process.getInputStream()
)并将其保存到文件中。