Jak uzyskać java getRuntime (). Exec (), aby uruchomić program wiersza poleceń z argumentami?

Próbowałem napisać program Java, który używaRuntime.getRuntime().exec() metoda użycia wiersza polecenia do uruchomienia instancji programu „tesseract”.

W tle, Tesseract to darmowy program open source, który służy do wykonywania OCR (Optical Character Recognition) na zdjęciach. Pobiera plik obrazu i wyświetla dokument tekstowy. Jest to program wiersza polecenia, który używa tego polecenia do uruchomienia

(z wnętrza powłoki wiersza polecenia)

tesseract imageFilePath outFilePath [optional arguments] 

przykład:

tesseract "C:\Program Files (x86)\Tesseract-OCR\doc\eurotext.tif" "C:\Users\Dreadnought\Documents\TestingFolder\out"

pierwszy argument wywołuje program tesseract, drugi to bezwzględna ścieżka do pliku obrazu, a ostatni argument to ścieżka i nazwa pliku wyjściowego. Tesseract wymaga tylko nazwy pliku wyjściowego, nie wymaga rozszerzenia.

Praca z wiersza polecenia działa doskonale. Jednak chciałem uruchomić to z programu java i wystąpiły pewne błędy.

Znalazłem ten kod jako bardzo pomocny jako punkt wyjścia

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String cmdString = "cmd /c dir";

         System.out.println(cmdString);
         Process pr = rt.exec(cmdString);

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

         String line = null;

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

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);

      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

Wypisuje wynik polecenia dir. Jednak kiedy tak to zmodyfikowałem

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String imageFilePath = "\"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\"";
         String outputFilePath = "\"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"";
         String[] commands = {"cmd", "/c", "tesseract", imageFilePath, outputFilePath };

         Process pr = rt.exec(commands);

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

         String line = null;

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

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);
      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

Jedyne, co wyświetla, toExited with error code 1. Jest to oczekiwane wyjście, jeśli proces zakończył się błędem.

Próbowałem nawet przejść"cmd /c tesseract \"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\" \"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"" i skończyło się na tym samym błędzie.

WedługUżywanie cytatów w getRuntime (). Exec Myślałem, że problem polega na tym, że próbowałem uciec z cytatów, dlatego przekazałem tablicę String. Ale wciąż dostajęExited with error code 1.

Czy możliwe jest wykonanie programu wiersza polecenia z javaRuntime.getRuntime().exec() dowództwo?

EDYTOWAĆ: Problem nadal występuje

Próbowałem nie używać „cmd / c” myśląc w ten sam sposób, jak sugerowali Evgeniy Dorofeev i Nandkumar Tekale. Mam jednak inny rodzaj błędu:

java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system  cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at Main.main(Main.java:15)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
... 4 more

Może to daje więcej informacji? Jestem naprawdę ciekawa, co powoduje ten problem. Również problem jest taki sam, niezależnie od tego, czy dodam cytaty z ucieczki do moich argumentów.

EDYCJA 2: Na kaprys podałem bezwzględną ścieżkę do pliku wykonywalnego tesseract i nie używamcmd /c pracował jak urok. Myślę, że pytanie może byćRuntime.getRuntime().exec() nie wywołuje zmiennych środowiskowych?

questionAnswers(4)

yourAnswerToTheQuestion