windows - Sådan læses STDOUT fra en anden app i Java uden buffering

Indlæg af Hanne Mølgaard Plasc

Problem



Fra Java kører jeg en C ++-app, der logger sine fremskridt, som den fortsætter, og vil overvåge, at der sker nogle fremskridt løbende, så (i Java) overvåger jeg process.getInputStream () og process.getErrorStream (). Når jeg kører C ++-appen fra kommandolinjen, vises loggen en linje ad gangen, da den går videre (ca. 1 linje meget 1-2 sekunder). Fra Java-skærmen får jeg ikke dataene i realtid, og jeg er ikke sikker på hvem der buffrer den.


Jeg kan se på C ++-koden (selv om den er ret kompleks) og forsøge at sætte flush () opkald efter behov, men dataene vises i realtid, når jeg kører det fra cmd.exe, så før jeg gør det kan lide at tjekke om der er noget andet i den måde, jeg skal gøre. Er der noget i Java, jeg skal gøre for at få dataene i realtid for at sikre, at indgangsstrømmen ikke er buffereret?


Jeg kører i Windows XP og derover.


jeg forsøgte


            for (;;) {
                int c = is.read();
                if (c < 0) {
                    break;
                }
                System.out.print(c);
                System.out.flush();
            }
            if (true) {
                return;
            }


og også forsøgt


            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                synchronized (lastActivityTime) {
                    lastActivityTime = java.util.Calendar.getInstance().getTimeInMillis();
                }
                if (pw != null) {
                    pw.println(type + line);
                    pw.flush();
                }
            }

Bedste reference


Det er kildeprocessen, der gør bufferen, i biblioteket stdio. Der er intet du kan gøre ved det i Java-enden. Du skal sætte fflush() opkald i C ++-koden eller sætte den op og vente. Dataene vises i realtid, når du kører fra cmd.exe, fordi stdio opfører sig anderledes, når det er fastgjort til det, det mener er en reel terminal.