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?