在linux中从java运行mysqldump

时间:2012-12-31 04:33:12

标签: java mysqldump runtime.exec

**直接在终端

上运行时,以下命令可以正常工作
mysqldump -uabc -pabc1234 --compact --no-create-info -w \"fieldname != 'A'\" dbname tablename -hhostaddress --result-file=/tmp/myfile.txt

**但是当使用Runtime()方法执行它时,它不会在目标文件中生成输出。

String s="mysqldump -uabc -pabc1234 --compact --no-create-info -w \"fieldname != 'A'\" dbname tablename -hhostaddress --result-file=/tmp/myfile.txt";
Runtime.getRuntime().exec(s);

(**说abc是用户名,abc1234是密码)

如果使用重定向到目标文件(>)而不是--result-file选项,则会出现同样的问题。 我该怎么做才能在java程序中执行它?

2 个答案:

答案 0 :(得分:0)

使用ProcessBuilder api更好地处理空格。输出将在结果文件中。

 new ProcessBuilder( "mysqldump" , "-uabc", "-pabc1234", ... ).start();

'>'是Shell间接 - 如果你的程序是shell,它就可以工作。

new ProcessBuilder( "bash", -"c "mysqldump" , "-uabc", "-pabc1234", ..., "> fileresult"  ).start();

答案 1 :(得分:0)

用于启用我使用过的文件

final Runtime r = Runtime.getRuntime();
            final Process p = r.exec("/bin/tar -xvf " + zipFile, null, fileDir);

其中zipFile - 目标文件名, fileDir - 当前dir路径(需要放置文件的地方)

我还使用了“/ bin / tar”,因为在Runtime.exec环境中隐藏了直接的“tar”。尝试使用直接路径(仅用于测试)。

日志只需在最后添加

        final int returnCode = p.waitFor();

        if (logger.isDebugEnabled()) {
            final BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = is.readLine()) != null) {
                logger.debug(line);
            }
            final BufferedReader is2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = is2.readLine()) != null) {
                logger.debug(line);
            }
        }