Entrée de tuyau de ligne de commande en Java


Voici un simple morceau de code:

import java.io.*;
public class Read {
 public static void main(String[] args) {
     BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
  while(true)
  {
   String x = null;
   try{
    x = f.readLine();
   }
   catch (IOException e) {e.printStackTrace();}
   System.out.println(x);
  }
 }
}

J'exécute ceci comme : java Read

Une Fois l'entrée.txt est complètement pipé dans le programme, x continue à obtenir des valeurs nulles infinies. Pourquoi donc? Existe-t-il un moyen de rendre la norme en(ligne de commande) active une fois le fichier introduit dans le code terminé? J'ai essayé de fermer le flux et de rouvrir, cela ne fonctionne pas. Réinitialiser etc. aussi.

Author: TJ-, 2009-09-16

4 answers

En exécutant "java Read < input.txt", vous avez indiqué au système d'exploitation que pour ce processus, le fichier canalisé est standard dans. Vous ne pouvez pas revenir à la ligne de commande depuis l'intérieur de l'application.

Si vous voulez faire cela, passez input.txt en tant que paramètre de nom de fichier pour l'application, ouvrez/lisez/fermez le fichier vous-même depuis l'intérieur de l'application, puis lisez depuis l'entrée standard pour obtenir des éléments depuis la ligne de commande.

 17
Author: skaffman, 2009-09-16 07:51:17

Eh bien, c'est typique pour la lecture dans un BufferedReader. readLine() renvoie null lorsque la fin du flux est atteinte. Peut-être que votre boucle infinie est le problème ;-)

// try / catch ommitted

String x = null;

while( (x = f.readLine()) != null )
{
   System.out.println(x);
}
 12
Author: SingleShot, 2009-09-16 07:56:53

Vous devez terminer votre boucle while lorsque la ligne est nulle, comme ceci:

    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
    }
    catch (IOException e) {
        logger.error("IOException reading System.in", e);
        throw e;
    }
    finally {
        if (in != null) {
            in.close();
        }
    }
 7
Author: dogbane, 2009-09-16 07:57:45

Existe-t-il un moyen de créer la norme Dans(Ligne de commande) actif une fois le fichier introduit dans le code terminé?

Désolé de cogner une vieille question, mais aucune des réponses jusqu'à présent ne souligne qu'il existe un moyen (shell uniquement) de renvoyer à l'entrée de la console après avoir sifflé dans un fichier.

Si vous exécutez la commande

{ cat input.txt & cat; } | java Read

Ensuite, le texte de input.txt sera passé à java Read et vous serez ensuite ramené à l'entrée de la console.

Remarque que si vous appuyez ensuite sur Ctrl+D , vous obtiendrez la boucle infinie de null s, sauf si vous modifiez votre programme pour terminer la boucle lorsqu'il reçoit null.

 0
Author: John Gowers, 2016-12-02 19:11:12