Runtime.getRuntime().exec() в Java с перенаправлением файлов

Возможный дубликат:
перенаправление с помощью Runtime.getRuntime ().exec() не работает

Я пытаюсь запустить сценарий SQL с Java в OS X, чтобы инициировать мою базу данных для тестирования. Я знаю, что это не лучший способ сделать это, но это временное решение.

Я пытался прочитать о функции exec() и о том, как передавать параметры, но я просто не могу заставить ее работать.

Мой код выглядит так:

try {
    Process p = Runtime.getRuntime().exec("/usr/local/mysql/bin/mysql -uroot dev_test <div/test_db.sql");

    p.waitFor();

    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

    while ((line = input.readLine()) != null) {        
        System.out.println(line);
    }

    input.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Я также пытался передать аргументы в массив строк, но безуспешно.

Мне удалось запустить его на машине с Windows, используя этот формат, но я не могу изменить его так, чтобы он работал в osx:

Process p = Runtime.getRuntime().exec(new String[] { "cmd", "/C", "mysql -u root dev_test < div\\test_db.sql" });

person Skovly    schedule 19.10.2012    source источник
comment
Да, заметил это решение. Но подумал, что это может быть по-другому, поскольку он перенаправляет вывод, а не ввод?   -  person Skovly    schedule 19.10.2012
comment
На самом деле это не отличается, потому что перенаправление вывода и ввода обрабатывается оболочкой, поэтому вам придется делать и то, и другое вручную (или вызывать оболочку явно), чтобы она работала. Явный вызов оболочки — это то, что делает ваше решение для Windows (где cmd.exe — это оболочка).   -  person Joachim Sauer    schedule 19.10.2012
comment
Спасибо, Иоахим. Я изменил его, чтобы использовать оболочку unix (bin/sh) так же, как и решение для Windows. Работал отлично. Спасибо!   -  person Skovly    schedule 19.10.2012


Ответы (1)


Изменен код для использования оболочки unix, как в решении для Windows. Результирующий код выглядит следующим образом:

String [] cmd = {"/bin/sh" , "-c", "/usr/local/mysql/bin/mysql -u root dev_test <div/test_db.sql"};
Process p = Runtime.getRuntime().exec(cmd);

Спасибо, Иоахим! Извините за репост.

person Skovly    schedule 19.10.2012