【问题标题】:Retrieve a table from mysql dump sql file using Java Runtime使用 Java 运行时从 mysql 转储 sql 文件中检索表
【发布时间】:2019-08-23 08:54:22
【问题描述】:

我可以使用终端命令 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

【问题讨论】:

  • 从 sed 参数中删除 '。并取消重复字符串中的`。

标签: java runtime.exec


【解决方案1】:

与从终端键入命令不同,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 的一个实用程序类。

【讨论】:

  • 谢谢。看起来 IOUtils 似乎 [已弃用] 如果您能给我链接以获取它或其他替代方法。
  • 我尝试使用以下代码,但输出文件再次完全转储,而不是所需的 mytable。尝试 (InputStream inputStream = process.getInputStream()) { Files.copy(inputStream, Paths.get("mytable.sql")); process.waitFor();
  • @ICL Sales EXIMON You can't use > to redirect your output when you use Runtime.exec. ,这就引出了一个问题,为什么要使用 Runtime,而不是使用本机 Java IO 和模式匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多