java - 使用 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
解决方案
与从终端键入命令不同,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 的一个实用程序类。
推荐阅读
- python - 如何循环回几行?
- hive - 支持 Hive 中的关键约束和删除级联
- flutter - 如何根据flutter中选定的dropdowmenuitems填充其他字段
- amazon-web-services - 如何升级 aws lambda 的节点版本
- raspberry-pi - 无法与 Raspberry pi 4 over (minicom) 通信 sparkun OBDII UART
- graphql - Apollo GraphQL 连接失败
- vue.js - 浏览器 vuex 存储数据,但是当我从 vuex 检索数据时,它显示我清空每个数组
- iis - 无法访问的虚拟目录导致 500.19 错误报告缺少 web.config 文件并且未触发重写规则
- python - Python在子文件夹中导入csv文件
- python - Python Pandas:检查列表中的项目是否在 df 索引中,其中 df 是多索引 df