2015-06-26 3 views
0

Я пытаюсь написать программу на Java для запуска pdfgrep в командной строке в заданном файле, но у меня возникают проблемы с ее выполнением.Передача файла в качестве аргумента командной строки в Java

Я написал следующий код:

public class PDFGrepCall { 
public static void main(String[] args) throws IOException, InterruptedException{ 
    PDFGrepCall obj = new PDFGrepCall(); 

    String searchterm = "git"; 
    String filename = "~/Documents/COMP2100/03git.slides.pdf"; 
    String newsearch = "'"+searchterm+"'"; 
    String command="pdfgrep -c "+newsearch+" "+filename; 
    System.out.println(command); 

    StringBuffer output = new StringBuffer(); 
    Process p; 

    p=Runtime.getRuntime().exec(command); 
    p.waitFor(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = reader.readLine(); 
    while ((line=reader.readLine())!=null) { 
     output.append(line+"\n"); 
     } 

    System.out.println(output.toString()); 

    } 

Это должно напечатать команду, которую я написал, и на новой строке выведите результаты команды (в этом случае число 57). Однако, когда я запускаю его, программа не дает мне результатов команды, просто печатает новую строку после команды и завершает работу.

Я могу подтвердить, что сама команда вне java работает нормально и что файл существует в указанном месте.

Я пропустил что-то о передаче аргументов файла в функции командной строки из Java? Что я должен делать, чтобы выполнить эту задачу правильно?

EDIT: Решено ниже. Это должно быть сделано правильно с помощью processbuilder и путем изменения каталога на дом, а не с помощью «~».

+1

Проверьте 'поток ошибок Process'. –

+0

@ g.grinovski вы можете получить ошибки от 'BufferedReader stdError = new BufferedReader (new InputStreamReader (proc.getErrorStream())); '? – chengpohi

+0

Добавил в него строку и код печати, я все равно получаю тот же результат. –

ответ

1

Я полагаю, вы обнаружите, что ~ не была прервана правильно (это было считать буквальным и не расширяется ехес функции)

Например, если я использую что-то вроде ...

ProcessBuilder pb = new ProcessBuilder("ls", "~"); 
    pb.redirectErrorStream(true); 

    try { 
     Process p = pb.start(); 
     InputStream is = null; 
     try { 
      is = p.getInputStream(); 
      int in = -1; 
      while ((in = is.read()) >= 0) { 
       System.out.print((char) in); 
      } 
     } finally { 
      try { 
       if (is != null) { 
        is.close(); 
       } 
      } catch (Exception e) { 
      } 
     } 
     System.out.println("Exited with " + p.waitFor()); 
    } catch (IOException exp) { 
     exp.printStackTrace(); 
    } catch (InterruptedException exp) { 
     exp.printStackTrace(); 
    } 

Он выдает:

ls: cannot access ~: No such file or directory 
Exited with 2 

Но если я изменю его

ProcessBuilder pb = new ProcessBuilder("ls"); 

все нормально работает.

Если вам нужен каталог домашнего пользователя, то вы будете нуждаться, чтобы прервать его самостоятельно, используя System.getProperty("user.home"), например

ProcessBuilder pb = new ProcessBuilder("ls", System.getProperty("user.home")); 

Я также высоко, рекомендуется использование ProcessBuilder, это позволяет вы перенаправляете поток ошибок в (среди других мест) InputStream, что облегчит жизнь и изменит «рабочий» каталог, из которого выполняется этот процесс, а также лучше обрабатывает аргументы с пробелами, а это значит, что вы можете что-то сделать ...

ProcessBuilder pb = new ProcessBuilder("ls"); 
pb.directory(new File(System.getProperty("user.home"))); 

И получите тот же результат, что и раньше

Дальнейшая проверка ...

Не имея pdfgrep установлен, я думал, что я мог бы попробовать grep

ProcessBuilder pb = new ProcessBuilder("grep", "-i", "banana", "~/Test.txt"); 

что привело к

grep: ~/Test.txt: No such file or directory 
Exited with 2 

(и да, Test.txt находится в домашнем каталоге)

Когда я изменил до

ProcessBuilder pb = new ProcessBuilder("grep", "-i", "banana", "Test.txt"); 
pb.directory(new File(System.getProperty("user.home"))); 

это привело

Bananas are yellow 
Exited with 0 
+0

Я изменил его так, что я запустил system.getProperty ("user.home") заранее и добавьте результаты этого на строку вместо «~», и это не сработало. Команда, запускаемая с результатами getProperty вне Java, возвращает тот же результат. Еще не пробовал использовать processbuilder. Может ли это изменить результаты функции? –

+0

Это возможно при выполнении различных функций ОС. Я продолжал тестирование с использованием 'grep', и он не удался, когда путь использовал' ~ ' – MadProgrammer

+0

О, и я об этом расскажу, вы также должны напечатать результат' p.waitFor(); ', обычно' 0' означает успех – MadProgrammer

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