【问题标题】:Execute iconv inside java application在java应用程序中执行iconv
【发布时间】:2011-09-05 08:52:07
【问题描述】:

我想将一个大的 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的两种方式的起始目录具有相同的起始目录。

【问题讨论】:

  • 请注意,您不需要从 Java 调用 iconv,因为该功能是 Java 内置的(除非您需要一种罕见的、不受支持的编码或其音译功能)。这将有助于避免the Runtime.exec() mess

标签: java iconv


【解决方案1】:

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

但是,您可以从 Java 中执行 bash,而不是获取 OutputStream:

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

【讨论】:

  • 谢谢保罗。相反,我决定使用“-o”开关作为解决方法。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2023-03-25
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多