2011-05-31 36 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

相關問題