Java импорт базы данных mysql / ошибка bin / bash - PullRequest
0 голосов
/ 20 октября 2011

Я хочу создать импорт базы данных, используя файл .sql с java, затем я нашел код, похожий на этот

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?или что я должен сделать ... я должен настроить что-то вроде пути переменной env?

я запускаю это на windows

решение заменить / bin / bash на cmd.exe и -cв / c, но когда я запускаю программу, на моей консоли появляется это сообщение

'mysql' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

хотя я уже настроил каталог mysql в переменной окружения PATH в Windows

1 Ответ

3 голосов
/ 20 октября 2011

/bin/bash не существует в Windows.Попробуйте заменить /bin/bash на cmd.exe и заменить переключатель -c на /c.

EDIT : если ваша 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();
}
...