Ho trascorso un po 'di tempo su questo e ci sono riuscito. Ho trovato questo blog durante la ricerca e ho deciso di tornare e fornire la mia soluzione per salvare il prossimo ragazzo qualche volta. Sto rispondendo come ospite con una e-mail falsa, quindi non interagirò, ma non dovrebbero essere richieste ulteriori informazioni.
Il 18 luglio '12 alle 19:41 Harry Johnston ha scritto:
"In linea di principio, se si sa quanti dati aspettarsi, è possibile utilizzare le funzioni della console API per creare una console per l'applicazione per scrivere a, quindi leggere l'output dalla console, ma non è possibile farlo da Java, è necessario scrivere un'applicazione C per farlo per te. "
Il fatto è che esiste già un'utilità che esegue questa operazione. È scritto per un uso leggermente diverso, ma può essere coxed nel fornire il risultato desiderato. Lo scopo previsto è di abilitare l'applicazione di una console di windows per interagire con un terminale tty in stile Linux. Lo fa eseguendo una console nascosta e accede direttamente al buffer della console. Se provassi ad usarlo, falliresti. Sono stato fortunato e ho scoperto che ci sono interruttori non documentati per questa utility che gli consentiranno di fornire un semplice output senza buffer. Senza gli interruttori fallisce con l'errore - l'output non è un tty - quando si prova a pipe output.
L'utilità è denominata winpty. È possibile ottenere qui:
https://github.com/rprichard/winpty/releases
Gli interruttori privi di documenti sono menzionati qui:
https://github.com/rprichard/winpty/issues/103
Sto utilizzando la versione MSYS2. Avrai bisogno di msys-2.0.dll per usarlo.
eseguire semplicemente:
winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe
-Xallow-non-tty
, permetterà l'uscita in filodiffusione
-Xplain
, rimuoverà i codici di escape terminale Linux aggiunti (o come si chiama)
file richiesti sono:
winpty.exe
winpty-agent.exe
winpty.dll
msys-2.0.dll
winpt y-debugserver.exe - Non necessario
Non c'è alcun equivalente. Windows non ha pseudo-terminali. –
@HarryJohnston Ciao Harry, vorrei usare Java per eseguire comandi esterni e leggere l'output stdout 'in tempo reale'. Alcuni programmi .exe mi stanno dando problemi a causa del buffering stdout. Non è stato possibile ottenere alcun output di stdout quando il programma è ancora in esecuzione. Quando il programma termina, ottengo improvvisamente un sacco di output stdout. (Questo programma è in grado di generare output di stdout in tempo reale quando lo eseguo manualmente nella finestra del prompt dei comandi) Come posso risolvere questo problema se non c'è uno pseudo terminale in Windows? – userpal
Non è il sistema operativo che esegue il buffering, è l'applicazione. Dovrai correggere i programmi .exe in questione in modo che non memorizzino il buffer dell'output. –