首页 > 解决方案 > 使用 Java 运行时从 mysql 转储 sql 文件中检索表

问题描述

我可以使用终端命令 sed 从 MySql Dump sql 文件中成功检索表,但它不适用于 Java Runtime。

我可以使用以下终端命令从 mydump.sql 成功检索 mytable

 >sed -n -e '/DROP TABLE.*`cusprod`/,/UNLOCK TABLES/p' mydump.sql > 
 >mytable.sql

但问题是我无法在我的 Java 程序中使用它。找到下面的代码。

 String[] executeCmd = new String[]{"sed", "-n", "-e", "'/DROP 
 TABLE.*``mytable``/,/UNLOCK TABLES/p'", "/home/mydump.sql > 
 /home/mytable.sql"};  
 >Process runtimeProcess;  
 >runtimeProcess = Runtime.getRuntime().exec(executeCmd);

我希望得到 mytable.sql 文件。目前我从终端命令获取,但使用 Java Runtime 我收到错误

sed: -e expression #1, char 1: unknown command: `''
Could not retrieve Table from Selected backup

标签: javaruntime.exec

解决方案


与从终端键入命令不同,Runtime.exec(以及所有其他语言)将您传递给它的所有参数作为原始值处理,并将它们直接传递给sed命令。所以,当你传入"'/DROP TABLE.*``mytable``/,/UNLOCK TABLES/p'"数组时,你正在传递

'/DROP TABLE.*``mytable``/,/UNLOCK TABLES/p'

作为脚本sed,而不是

/DROP TABLE.*``mytable``/,/UNLOCK TABLES/p

请注意,脚本中没有引号。

您不需要在 Java 中引用您的脚本 --- 字符串本身将直接代表整个脚本。

你的最后一个论点也有类似的问题。使用时不能>重定向输出Runtime.exec。您应该编写自己的代码来读取输出并将其重定向sed Process到所需的文件。

尝试以下操作:

Process process = Runtime.getRuntime().exec(new String[]{"sed", "-e", "/DROP TABLE.*`cusprod`/,/UNLOCK TABLES/p", "/home/mydump.sql"});
try (FileOutputStream outputStream = new FileOutputStream("/home/mytable.sql")) {
  IOUtils.copy(process.getInputStream(), outputStream);
  process.waitFor();
} catch (IOException | InterruptedException e) {
  // Error handling
}

这将运行命令:

sed -e '/DROP TABLE.*`cusprod`/,/UNLOCK TABLES/p' '/home/mydump.sql'

并将输出写入文件/home/mytable.sql

IOUtils是 Apache 的一个实用程序类。


推荐阅读