1

大きな 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();

問題は、 process.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を呼び出す2つの方法の開始ディレクトリには、同じ開始ディレクトリがあります。

4

2 に答える 2

3

MByD が言ったように、リダイレクト記号はシェルの機能です。

ただし、OutputStream を取得する代わりに、Java から bash を実行できます。

... .exec("bash -c 'iconv -c -f gb2312 -t utf-8 20110525.csv > 20110525.utf8.csv'")
于 2011-05-31T10:30:39.533 に答える
2

リダイレクト記号 ( >) は、Java ではなく shell/cmd の機能です。Java からプロセスを実行する場合は使用できません。

プロセス ( InputStream is = process.getInputStream()) の OutputStream を取得して、ファイルに保存できます。

于 2011-05-31T10:14:01.057 に答える