gpt4 book ai didi

java - 如何让 java getRuntime().exec() 运行带参数的命令行程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:12 28 4
gpt4 key购买 nike

我一直在尝试编写一个 java 程序,该程序使用 Runtime.getRuntime().exec() 方法来使用命令行来运行程序“tesseract”的实例。

一些背景,Tesseract 是一个免费的开源程序,用于对图片执行 OCR(光学字符识别)。它接收一个图片文件并输出一个文本文档。它是一个命令行程序,使用这个命令来运行

(在命令提示符 shell 中)

tesseract imageFilePath outFilePath [optional arguments] 

例子:

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

第一个参数调用 tesseract 程序,第二个参数是图像文件的绝对路径,最后一个参数是输出文件的路径和名称。 Tesseract 只需要输出文件的名称,不需要扩展名。

在命令提示符下工作非常完美。但是,我想从 Java 程序运行它,但遇到了一些错误。

我发现这段代码作为起点非常有用

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();
}
}
}

它打印出 dir 命令的结果。但是当我这样修改它时

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();
}
}
}

它唯一输出的是Exited with error code 1。如果进程以错误结束,这是预期的输出。

我什至尝试通过 "cmd/c tesseract\"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\"\"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"" 我最终遇到了同样的错误。

根据 Using Quotes within getRuntime().exec我认为问题是我试图转义引号,所以这就是我传入 String 数组的原因。但我仍然收到 Exited with error code 1

是否可以使用 java Runtime.getRuntime().exec() 命令执行命令行程序?


编辑:问题仍然存在

我尝试不使用“cmd/c”,按照 Evgeniy Dorofeev 和 Nandkumar Tekale 在下面建议的相同推理思路思考。但是,我得到了另一种错误:

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

也许这提供了更多信息?我真的很好奇是什么导致了这个问题。无论我是否将转义引号添加到我的参数中,问题都是一样的。


编辑 2:一时兴起,我提供了 tesseract 可执行文件的绝对路径,并且不使用 cmd/c 就像一个魅力。我想问题是 Runtime.getRuntime().exec() 可以不调用环境变量吗?

最佳答案

您没有捕获 STDERR,因此当发生错误时您不会从 STDOUT(您正在捕获的)接收它们。尝试:

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

关于java - 如何让 java getRuntime().exec() 运行带参数的命令行程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13467307/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com