Javaからmysqlコマンドを実行し、結果をファイルに書き出したい。


Javaからmysqlコマンドを実行し、結果をファイルに書き出したいのですがうまく行きません。

実行環境はMacOS 10.11.2です。

[code]

    public class Main {
        public static void main(String[] args) {
            String[] cmd = new String[]{"/bin/sh", "-c", "mysql", "-u", "root", "-ppassword", "databaseName"};
    
            ProcessBuilder builder = new ProcessBuilder(cmd);
            builder.redirectInput(ProcessBuilder.Redirect.from(new File("sample.sql")));
            builder.redirectOutput(new File("result.tsv"));
    
            try {
                Process p = builder.start();
                p.waitFor();
                System.out.println(builder.redirectInput());
            } catch (IOException | InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
[/code]

sample.sql `select * from sample;`

コンソールにredirect to read from file "sample.sql"と出力され、  
result.tsvは空白のまま生成されます。

ターミナルに直接`mysql -u root -ppassword -D sql2xlsx < sample.sql >
result.tsv`と入力した場合は、  
result.tsvにはselectの結果が入力されます。




コメント欄より引用

> /bin/sh: mysql: command not found

`mysql`コマンドが見つからない時に表示されるエラーです。

> p.waitfor();の戻り値は127です。

これも `/bin/sh` が `-c` で指定されたコマンドを見つけられない時に返すコードです。  
ターミナル上で次の実行すると再現すると思います。

[code]

    $ /bin/sh -c mysql -u root -p...
    /bin/sh: mysql: command not found
    
    $ echo $?
    127
    
[/code]

回避するには `mysql` コマンドをフルパスで指定してみてください。

[code]

    $ /usr/local/bin/mysql -u root -p ...
    
[/code]




コメント欄より引用

> /bin/sh: mysql: command not found

`mysql`コマンドが見つからない時に表示されるエラーです。

> p.waitfor();の戻り値は127です。

これも `/bin/sh` が `-c` で指定されたコマンドを見つけられない時に返すコードです。  
ターミナル上で次の実行すると再現すると思います。

[code]

    $ /bin/sh -c mysql -u root -p...
    /bin/sh: mysql: command not found
    
    $ echo $?
    127
    
[/code]

回避するには `mysql` コマンドをフルパスで指定してみてください。

[code]

    $ /usr/local/bin/mysql -u root -p ...
    
[/code]

