在JAVA中使用运行时类时如何更改stdin

在JAVA中使用运行时类时如何更改stdin,java,inputstream,stdin,bufferedimage,outputstream,Java,Inputstream,Stdin,Bufferedimage,Outputstream,我想使用tesseract来识别一些文本,我将使用运行时类来执行系统命令。在这里,我想使用stdin输入img,而不是读取文件 private-String预处理cmdCommand(BuffereImage img)引发IOException、InterruptedException{ String cmd=“D:\\Program Files\\Tesseract OCR\\Tesseract.exe标准输出-l chi_sm”; Runtime run=Runtime.getRuntime

我想使用tesseract来识别一些文本,我将使用
运行时
类来执行系统命令。在这里,我想使用stdin输入img,而不是读取文件

private-String预处理cmdCommand(BuffereImage img)引发IOException、InterruptedException{
String cmd=“D:\\Program Files\\Tesseract OCR\\Tesseract.exe标准输出-l chi_sm”;
Runtime run=Runtime.getRuntime();
试一试{
进程p=run.exec(cmd);
//写入标准输入流
OutputStream stdin=p.getOutputStream();
write(HelpFunction.getImageBinary(img,“png”);/(TesseractOcr.java:40)
InputStream stdout=p.getInputStream();
消费输入流(stdout);
如果(p.waitFor()!=0){
if(p.exitValue()==1)
System.err.println(“fail!”);
}
}捕获(IOException | InterruptedException e){
e、 printStackTrace();
}
返回null;
}
我尝试了第一个答案建议的方法,但我遇到了一个例外

java.io.IOException:管道正在关闭
位于java.base/java.io.FileOutputStream.writeBytes(本机方法)
位于java.base/java.io.FileOutputStream.write(FileOutputStream.java:347)
位于java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:123)
位于java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108)
在ocr_processor.TesseractOcr.preprocessCmdCommand(TesseractOcr.java:40)上
在ocr_处理器上.TesseractOcr.recognizeSingleText(TesseractOcr.java:57)
Test.testOrientFunction(Test.java:32)
at Test.main(Test.java:42)
[信息]2020-07-16 08:57:42783方法:Test.testOrientFunction(Test.java:32)

我的平台是windows 10,Java SDK是14.0.1。

启动进程时,该方法返回一个流,该流写入进程的标准输入流

Process p = ...
OutputStream stdin=p.getOutputStream();
// Write to the standard input stream
stdin.write(...);

ProcessBuilder类为您提供了更多的控制:例如,您可以将stdin连接到文件。

今天,我从其他问题中得到了一个想法。我终于用下面的代码实现了我的目标

Runtime=Runtime.getRuntime();
试一试{
Process Process=runtime.exec(“cmd/c tesseract stdin stdout”);
OutputStream os=process.getOutputStream();
write(util.HelpFunction.getBinaryImage(img));
os.close();
consumeInputStream(process.getInputStream());
int exitVal=process.exitValue();
System.out.println(“进程退出值为”+exitVal);
}捕获(IOE异常){
e、 printStackTrace();
}

谢谢你帮我!:)

我尝试了你的方法,但是我得到了一个名为
java.io.IOException:pipe正在关闭的异常。有什么问题吗?请在问题中添加异常的详细信息(堆栈跟踪和抛出异常的行)以及相关代码。另外,您使用的是哪种操作系统?我已经更改了我问题的描述,我的代码有什么问题吗?这听起来像是Windows特有的问题,我不太了解Windows上进程间管道通信的工作原理。在不读取的情况下,在管道中可以写入的数据量可能是有限制的。也许tesseract坠毁了。作为一种解决方法,您可以尝试将图像保存在一个临时文件中,并让tesseract读取该文件。我在Ubuntu上尝试了相同的脚本,它可以正常工作,因此这可能是不同平台之间的差异。我发现JAVA对于像我这样的新手来说有点复杂(