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

