2011-05-31 146 views
1

我想将一个大的csv文件从gb2312编码转换为UTF-8编码。 这里是我使用的代码:在java应用程序内执行iconv

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正在等待我的输入,就像从命令行调用它,并没有参数。但从另一个终端会话。我可以看到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的两种方式的起始目录具有相同的起始目录。

+1

请注意,您不应该需要从Java调用'iconv',因为该功能是内置在Java中(除非您需要一种罕见的,不受支持的编码或其音译功能)。这有助于避免[Runtime.exec()混乱](http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html)。 – 2011-05-31 10:51:01

回答

2

重定向标志(>)是shell/cmd特性,而不是java,在执行java进程时不能使用它。

您可以抓取进程的OutputStream(InputStream is = process.getInputStream())并将其保存到文件。

3

正如MByD所说,重定向标志是一个shell特征。

然而,而不是抓住的OutputStream你可以改为从Java执行的bash:

... .exec("bash -c 'iconv -c -f gb2312 -t utf-8 20110525.csv > 20110525.utf8.csv'") 
+0

谢谢保罗。相反,我决定使用“-o”开关作为解决方法。 – 2011-06-01 01:43:28