我有一个EXE,用python编写,然后将其转换为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{私有静态最终记录器log=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();
}
}
尝试这样的方法:
public static void main(String[] args) throws IOException {
Process p = new ProcessBuilder().command("ping", "webelement.click").start();
InputStream i = p.getInputStream();
Scanner scanner = new Scanner(i);
while (scanner.hasNextLine()){
System.out.println(scanner.nextLine());
}
}
问题内容: 我正在尝试找到流式传输Java应用程序中生成的实时视频的方法。该应用程序需要获取其自身的屏幕截图,并将其编码为视频流,然后发布该流。 到目前为止,我一直在使用Xuggler(FFMPEG之上的Java库)将屏幕截图编码为视频文件。这很好。Xuggler声称能够通过RTMP传输实时视频,但是我还没有找到任何有关如何以编程方式进行此操作的文档。 有谁知道如何以编程方式从Xuggler流式传
我已经从谷歌阅读了这个标准描述:https://developer.android.com/training/sharing/receive 在此之后,我更新了我的AndroidManifest.xml,以包括一个意图过滤器来接受来自其他应用程序的共享(对于各种哑剧类型)。 我可以将我的应用程序视为其他应用程序中的共享选项,当我在其他应用程序中选择一个文件(例如,照片应用程序中的图像文件)并选择与
问题内容: 我正在使用log4j创建一个Java应用程序。我给出了配置log4j文件的绝对路径,还给出了生成的日志文件(生成此日志文件的位置)的绝对路径。我可以通过以下方式在运行时获取Java Web应用程序的绝对路径: 但是在普通的Java应用程序中,我们可以使用什么呢? 问题答案: 尝试;
我尝试过各种各样的解决方案,从堆栈溢出没有运气。我想要什么。 我知道不同应用程序的包名 例如,我有一个包名。如何获取此应用程序图标并在ImageView中显示?
问题内容: 我需要检查是否可以显式设置可以传递给JVM的某些选项,或者是否具有其默认值。 更具体地说:我需要创建一个本机堆栈大小比默认线程大的特定线程,但是如果用户想通过指定-Xss选项自己处理此类事情,我想创建所有具有默认堆栈大小的线程(将由用户在-Xss选项中指定)。 我已经检查了类和,但是这些类并没有给我有关VM参数的任何有用信息。 有什么方法可以获取我需要的信息吗? 问题答案: 通过此代码
问题内容: 用代码退出Java应用程序的最佳方法是什么? 问题答案: 您可以用于此目的。 根据oracle的Java 8文档: 终止当前正在运行的Java虚拟机。参数用作状态码;按照惯例, 非零状态代码表示异常终止 。 此方法在类Runtime中调用exit方法。此方法永远不会正常返回。 该调用实际上等效于该调用: