Ошибка Java import mysql database /bin / bash

#java #mysql #database #bash #bin

#java #mysql #База данных #bash #bin

Вопрос:

Я хочу создать импорт базы данных, используя 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. Это в Linux? Можете ли вы запустить /bin/bash в терминале / консоли, за пределами Java?

2. Вы пытаетесь запустить /bin/bash в Windows?

3. Я в Windows @Philipp: я в Windows, когда я набираю cmd, ‘/bin / bash /’ не распознается как внутренняя или внешняя команда,

4. @Angga Saputra Ответ прост.. «Способ запуска процесса в командной строке Windows, используйте тот же метод в exec() »

Ответ №1:

/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();
}
  

Комментарии:

1. вау, большое спасибо @Luke, теперь это работает, но моя база данных не была успешно импортирована .. когда я пытаюсь «mysql -p -h localhost test < mydb.sql» в командной строке, команда mysql прошла успешно

2. @AnggaSaputra: что вы подразумеваете под «не успешно импортировано»? Вы получаете сообщение об ошибке? Зависает ли ваша Java-программа? Кажется, что ваша программа успешно завершена, но в вашей базе данных нет данных?

3. моя ошибка.. Я имею в виду, что да, это завершается, но в моем database..it все еще пусто

4. Я попытался заменить команду pr.exec на «dir», затем она печатает мою текущую программу dir … затем я заменяю команду только на «mysql» и ничего не показывает..

5. спасибо, Люк, я печатал сообщение об ошибке с помощью pr.getErrorStream(), и теперь проблема в том, что команда mysql не была обнаружена как команда моим cmd.exe знаете ли вы, почему это происходит? хотя я уже настроил в своей переменной среды PATH