Выполнить iconv внутри Java-приложения - PullRequest
1 голос
/ 31 мая 2011

Я хочу преобразовать большой 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 ждет моего ввода, как будто он вызывается из командной строки и не дает аргументов. Но из другого сеанса терминала. Я вижу, как 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 ]

3 голосов
/ 31 мая 2011

Как сказал MByD, знак перенаправления является функцией оболочки.

Однако вместо получения OutputStream вы можете вместо этого выполнить bash из Java:

... .exec("bash -c 'iconv -c -f gb2312 -t utf-8 20110525.csv > 20110525.utf8.csv'")
2 голосов
/ 31 мая 2011

Знак перенаправления (>) является функцией shell / cmd, а не java, его нельзя использовать при выполнении процесса из java.

Вы можете получить OutputStream процесса (InputStream is = process.getInputStream()) и сохранить его в файл.

...