#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
может быть сообщение об ошибке или запись чего-либо в стандартный вывод или стандартные потоки ошибок. Если это так, вам нужно либо:
- прочитайте поток (ы), вызывающий нарушение, или
- если вы уверены, что можете это проигнорировать, перенаправьте поток (ы) нарушителей на
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