Java: Aucune entrée de l'objet Process jusqu'à la fermeture du programme


J'essaie d'obtenir une entrée de la console d'un .processus exe démarré par un script Java. Rien n'apparaît dans la fenêtre de la console et rien n'est lu par le programme tant que le processus n'est pas terminé.

blServ = new ProcessBuilder(blPath + "Blockland.exe", "ptlaaxobimwroe", "-dedicated", "-port " + port, "-profilepath " + blPath.substring(0, blPath.length() - 1)).start();
System.out.println("Attempting to start server...\n" + blPath);
consoleIn = new BufferedReader(new InputStreamReader(blServ.getInputStream()));

'blServ' est un objet Process. Et oui, le programme démarre avec succès.

public void blStreamConsole() //called once every 500 milliseconds
{
    String lineStr = "";
    String line = "";
    int lines = 0;
    try
    {
        if (consoleIn != null)
        {
            while ((line = consoleIn.readLine()) != null)
            {
                //if (!line.equals("%"));
                //{
                    lineStr += line + wordSym;
                    lines++;
                //}
            }
        }
    }
    catch (IOException e)
    {
        netOut.println("notify" + wordSym + "ERROR: An I/O exception occured when trying to get data from the remote console. Some lines may not be displayed.");
    }
    if (!lineStr.equals("") && !(lineStr == null))
        netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr);
}

Fondamentalement, cette méthode voit s'il y a plus d'entrée en attente dans l'objet consoleIn, et s'il y en a, elle ajoute chaque ligne qu'elle a à une autre chaîne, et cette autre chaîne est envoyée à un client. Malheureusement, tout est envoyé dans un gros morceau juste quand Blockland.exe est fermé. Désolé pour les problèmes d'indentation. L'éditeur Stackoverflow a réorganisé tout le code.

Author: Jonathan Leffler, 2013-07-18

2 answers

, Il me semble qu'il y a deux possibilités ici:

  • readLine bloque, en attente d'entrée (et ne renvoie pas null comme prévu). Vous pourrez peut-être le réparer en pas en utilisant BufferedReader et à la place en utilisant le InputStream

  • Le flux de sortie ne se vide pas tant que toutes les entrées n'ont pas été écrites. Essayez de mettre un flush là:

    Notez Également que si lineStr est null, vous obtiendrez un NullPointerException, comme votre code est actuellement (vous devez échanger votre conditions), mais il ne peut même pas être null.

    if (!lineStr.isEmpty())
    {
       netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr);
       netOut.flush();
    }
    
 0
Author: Dukeling, 2017-05-23 12:21:36
while ((line = consoleIn.readLine()) != null){
     lineStr += line + wordSym;
     lines++;
}

Le problème avec ce morceau de code est qu'il continuera à fonctionner jusqu'à ce que le programme se termine. Il ajoutera chaque ligne de lineStr jusqu'à ce que le programme se termine (lorsque console.readLine() est null). L'ensemble lineStr est ensuite imprimé, contenant la console entière.

Si vous souhaitez imprimer la sortie en continu, vous devez l'imprimer immédiatement:

while ((line = consoleIn.readLine()) != null){
     netOut.println(line);
}

Vous pouvez l'exécuter dans un thread séparé, et il continuera à sortir la console dans le flux de sortie jusqu'à ce que le le programme se termine.

 0
Author: Tom Verelst, 2013-07-18 17:08:44