我尝试使用 ProcessBuilder 从java类执行命令行进程
成功的执行实际上在我的日食中打开了另一个终端
*就像:*
过程---->打开---->子过程
其余的所有命令都必须在子流程中执行
有人帮助我了解如何触发子流程并完成退出后。
2*A_mat
NB:
给定命令只是一个例子,问题与'jdbc'无关,它与过程有关。子进程。
答案 0 :(得分:1)
您误解了如何调用操作系统进程。
每个进程都包含程序名称(如notepad.exe
或java.exe
),以及零个或多个命令行参数。
ProcessBuilder一次能够运行一个命令。构成其命令的字符串列表不是单独的命令;它们代表程序名称及其各个命令行参数。
因此,要运行mysql,您需要分离命令行参数:
ProcessBuilder pb = new ProcessBuilder("mysql", "-u", "root", "-p", password);
您的下一行select * from employee;
不是系统命令,也不是子进程。这是一个mysql命令 - 仅由mysql理解的指令。您可以将它写入mysql进程的标准输入,因为mysql碰巧通过标准输入接受命令:
try (Writer writer = new OutputStreamWriter(process.getOutputStream())) {
write.write("select * from employee;");
}
然而,并非所有程序都通过标准输入接受命令。
您似乎意识到,mysql不适合外部进程。阅读和解析输出将比初看起来更困难。 JDBC将是更好的选择。 (你似乎知道这一点,但我提到它是为了其他读者的利益。)
答案 1 :(得分:0)
我无法测试您正在执行的确切命令,但问题可能是它们实际上没有停止执行,这就是您的主进程不会停止的原因。
解决方法是:
isAlive()
检查这些命令是否仍在执行(并在超时后终止这些进程)。waitFor(long timeout, TimeUnit unit)
方法使它们在超时后终止。然后,您可以使用exitValue()
方法检查进程是否正常退出。答案 2 :(得分:0)
看看你的例子,看起来你正试图在mysql上运行sql命令。
首先,如果您真的想使用msqyl命令行命令执行此操作,则需要将其输入/输出重定向到java InputStream / OutputStream,然后将您的SQL请求发送到mysql进程输入。您可能会关注此示例:
List<String> command = new ArrayList<>();
command.add("mysql -u root -p ********");
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
PrintStream commandIn = new PrintStream(process.getOutputStream());
commandIn.println("select * from employee;");
其次,在mysql实例上运行SQL命令的最佳方法是使用JDBC而不是mysql命令行工具。寻找那里的众多JDBC教程。
这是一个更完整(和工作)的例子。 看看这个&#34;命令行工具&#34;:
public class TestCmd {
public static void main(String[] args) throws IOException
{
System.out.println("Started. args[0]=" + args[0]);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for(;;)
{
String line = in.readLine();
if (line == null) break;
System.out.println("echo:" + line);
}
}
}
然后是&#34;驱动程序&#34; program witch演示如何向此命令行工具发送命令:
public class TestDriver {
final static String JAVA_EXE = "C:\\...\\java.exe";
final static String CLASS_BASEPATH = "C:\\...\\java\\bin";
public static void main(String[] args) throws Exception
{
List<String> command = new ArrayList<>();
command.add(JAVA_EXE.toString());
command.add("-classpath");
command.add(CLASS_BASEPATH);
command.add("TestCmd");
command.add("Parameter");
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectOutput(new File("c:\\temp\\out.txt"));
Process process = pb.start();
PrintStream commandIn = new PrintStream(process.getOutputStream());
commandIn.println("first input line");
commandIn.flush();
commandIn.println("second input line");
commandIn.flush();
// give some time to the sub process to finish writing its output
Thread.sleep(100);
process.destroy();
}
}
在输出&#34; out.txt&#34;你会得到的,如预期的那样:
Started. args[0]=Parameter
echo:first input line
echo:second input line