You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ中调用.class文件启动进程无法获取输出问题求助

问题原因分析
  • 核心问题1:InputStream.available()方法使用错误
    该方法仅返回当前无需阻塞即可读取的字节数量,并非子进程输出的总字节数。你在启动进程后立刻调用available(),此时子进程还未完成输出,返回值为0,直接跳过了整个读取循环,自然拿不到输出内容。
  • 核心问题2:主类调用路径错误
    Ejemplo2类属于Ejemplo2包,你直接在Ejemplo2目录下执行java Ejemplo2会报类找不到错误,该错误输出到标准错误流(stderr),而你仅读取了标准输出流(stdout),因此看不到报错信息,也拿不到正常输出。
  • 核心问题3:未等待子进程执行完成就结束了父进程逻辑,子进程的输出还没来得及传回父进程就被终止。
修复方案
  1. 替换流读取逻辑,不要用available()判断读取长度,改用read()到返回-1的逻辑读取全部输出
  2. 修正进程启动参数,带包名调用主类,调整工作目录到包根路径
  3. 合并标准错误流到标准输出流,避免子进程报错无法感知
修复后完整Ejemplo3代码
package Ejemplo3;

import java.io.*;

public class Ejemplo3 {

    public static void main(String[] args) throws IOException{

        // 工作目录调整为包的根目录,不是Ejemplo2子目录
        File directorio = new File("./out/production/psp-2122");
        // 主类写完整的包名+类名
        ProcessBuilder pb = new ProcessBuilder("java", "Ejemplo2.Ejemplo2");
        pb.directory(directorio);
        // 合并错误流到输出流,方便排查问题
        pb.redirectErrorStream(true);
        System.out.printf("Directorio de trabajo: %s%n",pb.directory());

        Process p = pb.start();

        try (InputStream is = p.getInputStream()) {
            int c;
            // 一直读到流结束,不需要用available判断
            while ((c = is.read()) != -1) {
                System.out.print((char) c);
            }
            // 等待子进程执行完成,获取退出码
            int exitCode = p.waitFor();
            System.out.println("Ejemplo2进程退出码:" + exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

内容的提问来源于stack exchange,提问作者NuruMero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:04