Java如何将标准输出重定向到非编译启动的其他命令提示符窗口
问题原因分析
- 你通过
cmd /c start cmd.exe启动进程时,Java拿到的Process对象对应的是执行/c start指令的临时cmd进程,而非start命令新开的W1窗口进程,二者是完全独立的,不存在IO关联。 inheritIO()是将临时cmd进程的IO与当前Java进程绑定,不会作用于W1窗口。- 你在
process.waitFor()之后才获取输出流,此时临时cmd进程已经执行完start指令退出,对应输出流早已关闭,写入内容无接收方,自然不会有打印。
可行解决方案
方案1:使用Windows命名管道实现全量输出重定向(支持后续所有System.out输出到W1)
这个方案可以完全实现你要的「输出控制权转移到W1窗口」的需求,Windows下可以通过命名管道做中转,代码实现如下:
import java.io.*; public class RedirectToNewCmd { public static void main(String... args) throws IOException, InterruptedException { // 1. 创建Windows命名管道 String pipePath = "\\\\.\\pipe\\myOutputPipe"; RandomAccessFile pipe = new RandomAccessFile(pipePath, "rw"); // 2. 启动W1窗口,持续读取管道内容并打印 new ProcessBuilder("cmd", "/c", "start cmd.exe /k \"type " + pipePath + "\"") .start() .waitFor(); // 3. 将System.out重定向到管道写入端 System.setOut(new PrintStream(new FileOutputStream(pipe.getFD()) { @Override public void close() throws IOException { // 避免流被意外关闭导致管道失效 } })); // 测试输出,所有内容都会打印到W1窗口 System.out.println("Done!"); System.out.println("后续所有System.out输出都会显示在W1窗口"); } }
注意:该方案仅适用于Windows系统,命名管道是Windows系统提供的进程间通信机制。
方案2:仅传递单次输出到W1窗口(轻量方案)
如果不需要持续重定向,只是要把指定内容打印到新窗口,可以直接把内容作为参数传给新启动的cmd执行:
public static void main(String... args) throws IOException, InterruptedException { String outputContent = "Done!"; // 直接让新窗口的cmd执行echo指令打印内容 new ProcessBuilder("cmd", "/c", "start cmd.exe /k \"echo " + outputContent + "\"") .start() .waitFor(); }
内容的提问来源于stack exchange,提问作者Navin SK
相关产品推荐
相关产品推荐

