2013-08-13 2 views
1

Я использую этот метод для отправки команды на Linux терминалИспользование PSQL в Linux с Java, чтобы импортировать SQL файл

public static String execute(String command) { 
    StringBuilder sb = new StringBuilder(); 
    String[] commands = new String[]{"/bin/sh", "-c", command}; 
    try { 
     Process proc = new ProcessBuilder(commands).start(); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 

     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      sb.append(s); 
      sb.append("\n"); 
     } 

     while ((s = stdError.readLine()) != null) { 
      sb.append(s); 
      sb.append("\n"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

Он прекрасно работает со многими командами, как «LS», «дата» и т.д ..

, но я хочу использовать команду Psql импортировать файл SQL в Postgre как:

PSQL -h локальный -p 5432 -u Postgres -d тест -f Test.sql

Я набрал эту команду вручную в терминале и работает отлично, но не с помощью метода выше (метод хорошо работает с датой, ls ...)

Похоже на записи метода в виде бесконечного цикла, когда он вызывает psql. Метод не заканчивается, когда метод вызывает psql.

ps: Я использовал export PGPASSWORD = pass, чтобы не пропускать пароль.

ответ

0

Я решил задачу о создании файла file.sh с

экспорта PGPASSWORD = проходят

psql -h ip -p port -U user -d databaseName -f sqlFilePath

незадана PGPASSWORD

Затем я использую метод выполнения:

execute("chmod +x file.sh"); //to give permission to file execute 

execute ("./file.sh") //to execute the file in terminal 

в конце концов, я удалить file.sh с

File file = new File("file.sh"); 
file.delete(); 
1

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

Вы можете решить эту проблему, используя несколько потоков для чтения потоков или путем перенаправления stderr или путем простого переключения всех выходных данных. Посмотрите на эти нити: