2015-09-30 3 views
1

Я успешно сбрасывал данные с использованием Java runtime.exec.
Теперь я хочу обрабатывать исключения, такие как «mysqldump: Got error: 1045: Access denied для пользователя« errre »@« localhost »(с использованием пароля: YES) при попытке подключения«
, когда я помещаю ошибочное имя пользователя или пароль или плохое, если условиеполучить сообщение об ошибке mysqldump из java

Но что я получил от process.getErrorStream(): «Предупреждение: использование пароля в интерфейсе командной строки может быть небезопасным». И getInputStream() является нулевым

В терминале, выход, как это:
туздЫшпр -uerror -p123456 erp_sys Предупреждение: Использование пароля на интерфейсе командной строки может быть небезопасно. mysqldump: Получил ошибку: 1045: Доступ запрещен для пользователя 'error' @ 'localhost' (с использованием пароля: YES) при попытке подключения

Я провел некоторое исследование, но до сих пор не могу найти способ получить mysqldump error.Anyone имеет опыт об этом?

ответ

0

Не знаю. Это работает для меня:

import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.nio.charset.Charset; 

import org.apache.commons.io.IOUtils; 

public class MysqlTest { 
    public static void main(String[] args) throws Exception { 
     Process p = new ProcessBuilder("mysqldump", "-u", "error", "-p123456", "erp_sys").start(); 
     ByteArrayOutputStream dmp = new ByteArrayOutputStream(); 
     // Use FileOutputStream dmp = ... in real cases. 
     Thread t1 = copyStreamsInBackground(p.getInputStream(), dmp); 
     ByteArrayOutputStream err = new ByteArrayOutputStream(); 
     Thread t2 = copyStreamsInBackground(p.getErrorStream(), err); 
     t1.join(); 
     t2.join(); 
     int exitCode = p.waitFor(); 
     if (exitCode != 0) { 
      System.err.println("Exit code: " + exitCode); 
      String errors = new String(err.toByteArray(), Charset.forName("utf-8")); 
      System.err.println(errors); 
     } else { 
      System.out.println("Exit code: " + exitCode); 
      String dumps = new String(dmp.toByteArray(), Charset.forName("utf-8")); 
      System.out.println(dumps); 
     } 
    } 

    private static Thread copyStreamsInBackground(final InputStream is, final OutputStream os) { 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        IOUtils.copy(is, os); 
        os.close(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
        throw new IllegalStateException(ex); 
       } 
      } 
     }); 
     t.start(); 
     return t; 
    } 
} 

Он печатает:

Exit code: 2 
mysqldump: Got error: 1045: Access denied for user 'error'@'localhost' (using password: YES) when trying to connect 
+0

ТНХ, ProcessBuilder это лучший способ, чем Runtime.exec – Cedric

+0

и BTV, ProcessBuilder.redirectOutput может заменить оболочку '>' – Cedric

Смежные вопросы