Pasé un tiempo en esto y lo logré. Encontré este blog durante la investigación, y decidí regresar y proporcionar mi solución para salvar al siguiente tipo en algún momento. Respondo como un invitado con un correo electrónico falso, por lo que no interactuaré, pero no se requerirá más información.
El 18 de julio a las 19:41 '12 Harry Johnston escribió:
"En principio, si se sabe la cantidad de datos que puede esperar, podría utilizar las funciones API de consola para crear una consola para la aplicación escriba y luego lea el resultado de la consola. Pero no puede hacer eso desde Java, necesitaría escribir una aplicación C para que lo haga por usted ".
La cosa es, ya existe una utilidad que hace esto. Está escrito para un uso ligeramente diferente, pero puede ser coherente para proporcionar el resultado deseado. Su propósito es permitir que una aplicación de consola de Windows interactúe con un terminal tty de estilo Linux. Lo hace ejecutando una consola oculta y accede directamente al búfer de la consola. Si intentaste usarlo, fallarías. Tuve suerte y descubrí que hay conmutadores no documentados para esta utilidad que le permitirán proporcionar una salida sin búfer simple. Sin los interruptores falla con el error - la salida no es una tty - cuando se trata de canalizar la salida.
La utilidad se llama winpty. Se puede conseguir aquí: se mencionan aquí
https://github.com/rprichard/winpty/releases
Los interruptores indocumentados:
https://github.com/rprichard/winpty/issues/103
estoy usando la versión MSYS2. Necesitarás el msys-2.0.dll para usarlo.
simplemente ejecute:
winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe
-Xallow-non-tty
, permitirá la producción de tuberías
-Xplain
, se eliminarán los códigos de escape añadido Linux (o como se llamen)
archivos requeridos son:
winpty.exe
winpty-agent.exe
winpty.dll
msys-2.0.dll
winpt y-debugserver.exe - No es necesario
No hay equivalente. Windows no tiene pseudo-terminales. –
@HarryJohnston Hola Harry, me gustaría usar Java para ejecutar comandos externos y leer la salida stdout 'en tiempo real'. Algunos programas .exe me están dando problemas debido al almacenamiento en búfer stdout. No pude obtener ningún resultado de stdout cuando el programa aún se está ejecutando. Cuando finaliza el programa, de repente obtengo una gran salida estándar. (Este programa puede generar salida stdout en tiempo real cuando lo ejecuto manualmente en la ventana del símbolo del sistema). ¿Cómo puedo resolver este problema si no hay un pseudo terminal en Windows? – userpal
No es el sistema operativo que hace el almacenamiento en búfer, es la aplicación. Necesitará reparar los programas .exe en cuestión para que no almacenen en búfer su salida. –