exe如何在Java中从控制台应用程序获取实时输出
我有一个用python编写的EXE,然后将其转换为EXE,当我运行EXE direclty时,我可以在控制台中实时看到输出,但当我用java运行EXE时,在EXE完成该过程之前,我无法看到输出
我有在线搜索,但没有工作,这里是示例代码
package com.imviewer.ai;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
公共类FaceAnalysis实现了AILibrary{ 专用静态最终记录器日志=LoggerFactory。getLogger(FaceAnalysis.class)
private static final String KILL = "taskkill /F /IM ";
private static final String EXE_CPU = "FaceAnalysis-CPU.exe";
private static final String EXE_GPU = "FaceAnalysis-GPU.exe";
List<String> paths = new ArrayList<>();
public FaceAnalysis() {
}
@Override
public void setArguments() {
log.info("Setting arguments");
paths.add(new File(AIUtils.FACE, EXE_CPU).getAbsolutePath());
paths.add("--images=yes");
paths.add("--videos=yes");
paths.add("--csv=no");
paths.add("--folderpath=\"Face\"");
paths.add("--algo=cnn");
paths.add("--gpu=no");
paths.add("--cpus=6");
paths.add("--debug=no");
paths.add("--fpstoproces=5");
paths.add("--upsample=0");
paths.add("--onlydetection=yes");
paths.add("--savefullimages=no");
paths.add("--savefaceimage=no");
paths.add("--enablebox=no");
paths.add("--maxarea=640000");
paths.add("--imageextensions=jpg,png,jpeg,tiff,raw,bmp");
paths.add("--videoextensions=mp4,avi,flv,mpeg,mpg,wmv");
paths.add("--age=1");
paths.add("--gender=1");
paths.add("--expression=1");
}
@Override
public void run() {
}
@Override
public void runEXE() {
log.info("Running Face Exe");
ProcessBuilder builder = new ProcessBuilder(paths);
builder.directory(new File(AIUtils.FACE));
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
builder.redirectInput(ProcessBuilder.Redirect.INHERIT);
builder.redirectErrorStream(true);
Process proc;
try {
proc = builder.start();
proc.getOutputStream().close();
// Any error message?
Thread errorGobbler
= new Thread(new StreamGobbler(proc.getErrorStream(), System.err));
// Any output?
Thread outputGobbler
= new Thread(new StreamGobbler(proc.getInputStream(), System.out));
errorGobbler.start();
outputGobbler.start();
// Any error?
int exitVal = proc.waitFor();
errorGobbler.join(); // Handle condition where the
outputGobbler.join(); // process ends before the threads finish
log.info("Exit Value: "+ exitVal);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.info("End Running Face EXE");
}
@Override
public boolean checkAlreadyRunning() {
// TODO Auto-generated method stub
return false;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
class StreamGobbler implements Runnable {
private final InputStream is;
private final PrintStream os;
StreamGobbler(InputStream is, PrintStream os) {
this.is = is;
this.os = os;
}
public void run() {
try {
int c;
while ((c = is.read()) != -1)
os.print((char) c);
} catch (IOException x) {
// Handle error
}
}
}
public static void main(String[] args) {
FaceAnalysis face = new FaceAnalysis();
face.setArguments();
face.runEXE();
}
}
# 1 楼答案
尝试以下方法: