【发布时间】:2018-02-25 15:10:10
【问题描述】:
我需要编写一个 Java 代码来创建一个运行 MySQL 控制台命令的 shell,并且可以保留交互式会话,直到它被故意破坏。
为了模拟它,这是我的代码。
ProcessBuilder pb;
pb = new ProcessBuilder(
"cmd.exe","/c","c://xampp//mysql//bin//mysql","-uroot");
Process p = pb.start();
OutputStream stdout = p.getOutputStream();
InputStream stdin = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdin));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdout));
boolean written = false;
while(true) {
System.out.println("loop... ");
writer.write("show databases;\r\n\r\n");
writer.flush();
writer.newLine();
writer.newLine();
writer.flush();
writer.close(); //If not close, it cannot produce result
String line;
line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
}
问题是,代码只运行一次,因为在循环中调用了writer.close()。但是如果我不打电话给writer.close(),它永远不会响应。
我怎样才能实现我的目标?
【问题讨论】:
-
首先请说明从Java启动
mysql的目的。而且,这个问题是针对 MySQL 还是针对 Java 的 ProcessBuilder?如果你启动cat而不是mysql会发生什么? -
从 Java 启动 MySQL 的目的是从 MySQL 控制台交互地发送命令和接收结果。不通过 JDBC 进行交互。最终目标实际上是为 MySQL 提示开发一个基于 REPL 特性的 web。希望我说清楚。
-
Java 会阻止顽皮的黑客说出
DROP DATABASE mysql吗? -
请记住,与 JDBC 相比,通过 cmd 和 mysql 的性能开销很大。
-
嗨 Rick,没关系...将在容器上运行它以检测恶意代码,或者我们将对其进行清理。 REPL 目前是针对 MySQL 的,但稍后将使其成为其他类似的交互,例如:Python 解释器。
标签: java mysql read-eval-print-loop