0

我想使用带有 java 的 .sql 文件创建数据库导入,然后我找到了类似这样的代码

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[]{"/bin/bash","-c","mysql -p -h localhost test < "+fileName.toString()});

我正在使用 netbean 来运行我的桌面应用程序。然后我收到了这个错误信息

java.io.IOException: Cannot run program "/bin/bash": CreateProcess error=2, The system cannot find the file specified

我的问题是我在哪里可以找到 /bin/bash 路径?或者我应该怎么做......我应该配置像环境变量路径这样的东西吗?

我在 Windows 上运行它

解决方案是用 cmd.exe 和 -c 替换 /bin/bash 到 /c,但是当我执行程序时,我的控制台上出现了这条消息

'mysql' 不是内部或外部命令、可运行程序或批处理文件。

虽然我已经在 Windows 的 PATH 环境变量中设置了 mysql 目录

4

1 回答 1

3

/bin/bash在 Windows 上不存在。尝试用 替换/bin/bash,然后用cmd.exe替换开关。-c/c

编辑:如果您的 Java 程序似乎成功完成但没有写入数据,那么您的 Java 程序很可能没有等待该mysql过程完成。尝试添加pr.waitFor();.

或者,mysql可能是报告错误消息或将某些内容写入其标准输出或标准错误流。如果是这种情况,您需要:

  1. 阅读有问题的流,或
  2. 如果您确定可以忽略它,请将有问题的流重定向到NUL.

您可以NUL通过添加>NUL到命令行来重定向标准输出,并通过添加重定向标准NUL错误2>NUL

我不建议丢弃输出/错误消息。如果有错误,你怎么知道?但是,很难正确处理使用Runtime.getRuntime().exec(...). 相反,我会使用ProcessBuilder. ProcessBuilder 允许您将mysql进程的标准错误重定向到标准输出,这使得从两个流中读取输出更容易一些(您不需要两个单独的线程)。

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "mysql -p -h localhost test < "+fileName.toString());
builder.redirectErrorStream(true);
Process pr = builder.start();

// Get mysql process's standard output/error.
InputStream is = pr.getInputStream();

// Now read from it and write it to standard output.
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}
于 2011-10-20T10:50:30.057 回答