我正在通过Java进程(在Windows 10,JDK 1.8 env。中)执行mysql.exe,代码如下:
String command="D:\\SW\\MySQL_8\\bin\\mysql.exe --user=root --password=password";
ProcessBuilder pBuilder=new ProcessBuilder(command.split(" "));
pBuilder=pBuilder.redirectOutput(new File("D:\\workspaces\\cas\\CASCAppliance_Common\\out\\out.txt"));
pBuilder=pBuilder.redirectError(new File("D:\\workspaces\\cas\\CASCAppliance_Common\\out\\err.txt"));
Process p=pBuilder.start();
OutputStream os=p.getOutputStream();
PrintWriter writer=new PrintWriter(os);
如果我从命令行执行mysql.exe,则会得到以下输出:
Microsoft Windows [Version 10.0.17134.228]
(c) 2018 Microsoft Corporation. All rights reserved.
D:\SW>cd MySQL_8\bin
D:\SW\MySQL_8\bin>mysql --user=root --password=password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
我尝试在错误流重定向后从进程中获取输入流,我只得到以下内容:
mysql: [Warning] Using a password on the command line interface can be insecure.
我还尝试将err和std重定向到文件,但err文件仍然包含上述文本,而std out文件不包含任何内容。
另一方面,如果我执行cmd.exe并运行命令“ dir”,那么我将从进程的InputStream中获取所需的目录列表。
我的问题是,我是在做错什么还是mysql.exe以无法从进程的输入流中获得上述输出的方式执行。
答案 0 :(得分:1)
是的,这是关于mysql的。 (编辑是来自@ dave_thompson_085的更新)
如果从交互式外壳运行mysql但重定向输入和/或输出,它将禁止显示标题,提示,表格装箱和“ N行(X秒)”预告片。
请注意,即使没有提示,它仍然会读取SQL语句并执行它们,并显示任何结果集-尽管如果输出是管道,它也会进行缓冲。相反,如果在终端上具有stdin和stdout的Java进程中,运行继承它们的mysql,则它具有完整的交互行为。