java - 如何从 Java 中的控制台应用程序获取实时输出

标签 java exe processbuilder

我有一个用python编写的EXE,然后将其转换为exe,当我直接运行exe时,我可以在控制台中实时看到输出,但是当我在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;

公共(public)类 FaceAnalysis 实现 AILibrary { 私有(private)静态最终Logger 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 - 如何从 Java 中的控制台应用程序获取实时输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58562753/

相关文章:

c# - 如何检查文件是否已在 C# 中签名?

C# 如何从进程中检索代码然后运行它?

java - 使用 java8 stream().map 传递两个参数来调用服务方法

java - 不允许使用Math.pow时计算指数?

java - 部署exe格式的应用程序

java - 如何使用 Java 中文本字段的用户输入运行 .sh 脚本?

java - 向进程发送 KeyEvents

java - Java线程中的BufferedWriter.append安全吗?

java - 带有 SpinnerDateModel 奇怪行为的 JSpinner

java - 在 apache karaf 上使用 apache Camel 蓝图的 Soap 请求失败