IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Redirection du flux d'entree sous linux


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Redirection du flux d'entree sous linux
    Bonjour,

    J'ai un gros probleme, mon ecole me demande de compiler mes programmes a l'aide de javac en console sous linux. Jusque la pas de probleme.
    Le probleme vient du fait que pour executer le programme, je dois utiliser un truc du genre :
    bob@ecole $ java mon_prog < commands

    C'est la partie en gras qui pose probleme.

    Dans mon code, j'ouvre plusieurs flux grace a (IN=new BufferedReader(new InputStreamReader(System.in)) ) pour lire les entrees au clavier, cela marche parfaitement.
    Mais une fois que je passe en console en mettant un fichier en entree, mon prog plante.
    Un prof m'a dit que cela venait de mon BufferedReader, le premier lisant les donnees du fichier en entree, et les autres n'ayant plus rien a lire, le flux restant vide apres.

    Comment puis je faire pour capturer les donnees contenues dans mon fichier en entree pour les transmettre a mes BufferedReader, afin de simuler une frappe au clavier.
    Ou alors comment puis je detecter qu'un fichier est passe en entree de mon programme.

    Si quelqu'un avait une idee, ou un lien aui puisse m'eclairer

    Ps: desole pour les accents je suis en qwerty
    [ Modéré par vedaer ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Que signifie planter?

    Il ne réagit plus.
    Il émet un message d'erreur.
    Une erreur est levée.

    Peut-on voir ton code?

    La redirection est gérée par l'OS. Tout devrait être transparant pour ton programme. Il ne devrait faire aucune distinction.
    Bien le bonjour chez vous
    Jowo

  3. #3
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    euu .. le passer en param et ouvrir 1 File, ça te va pas ?
    Toute vérité est bonne à entendre, même si toutes les vérités ne sont pas bonnes à dire.
    Rien ne sert de partir à point, il vaut mieux courir .

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Fl4mBy
    Dans mon code, j'ouvre plusieurs flux grace a (IN=new BufferedReader(new InputStreamReader(System.in)) ) pour lire les entrees au clavier, cela marche parfaitement.
    Mais une fois que je passe en console en mettant un fichier en entree, mon prog plante.
    Un prof m'a dit que cela venait de mon BufferedReader, le premier lisant les donnees du fichier en entree, et les autres n'ayant plus rien a lire, le flux restant vide apres.
    Il te suffit de n'utiliser qu'un seul BufferedReader sur System.in pour toute ton application (pourquoi est-ce que tu en ouvre plusieurs ?)



    Citation Envoyé par jowo
    Que signifie planter?
    C'est vrai qu'il vaut mieux être plus descriptif sur l'erreur exacte...


    Citation Envoyé par jowo
    La redirection est gérée par l'OS. Tout devrait être transparant pour ton programme. Il ne devrait faire aucune distinction.
    En fait dans son code il doit avoir quelque chose comme ca (plusieurs création de BufferedReader) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IN=new BufferedReader(new InputStreamReader(System.in));
    ...
    IN.close();
     
    IN=new BufferedReader(new InputStreamReader(System.in));
    ...
    IN.close();
    Lorsque System.in correspond à la saisie utilisateur il n'y a aucun problème car les saisies se font après chaque création de BufferedReader.

    Mais lorsque System.in correspond à un fichier, le BufferedReader lit 4Ko de donné d'un coup (il me semble), donc si le fichier fait moins de 4Ko, le second BufferedReader n'a plus rien à lire... d'où le problème...


    Citation Envoyé par NeptuS
    euu .. le passer en param et ouvrir 1 File, ça te va pas ?
    Ce n'est pas tout à fait la même chose. La redirection de flux permet par exemple d'utiliser le programme dans des pipes :
    C'est très pratique pour cumuler plusieurs traitements différents par plusieurs applis... Si tu utilises un fichier en paramètres cela t'oblige à créer des fichiers temporaires...

    a++

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Un exemple d'un programme qui convertit les données lues sur son entrée standard en majuscule. La sortie est faite sur sa sortie standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Echo {
    public static void main(String[] args)
    	throws IOException {
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(input);
        String s;
        while((s = reader.readLine()) != null) {
            System.out.println(s.toUpperCase());
        }
        reader.close();
        input.close();
    }
    }
    Ce code tourne parfaitement en mode console et avec un fichier en entrée sur Windows XP.

    A toi de le tester sur Linux.

    Pour terminer le programme en mode console (sous Windows) CTRL+Z.
    Bien le bonjour chez vous
    Jowo

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses, j'avais pas trop envie de poster mon code car il est un peu long, je vais vous mettre l'essentiel :

    Fonction Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	public static void main(String arg[]) {
    		// Displaying the Menu
    		String cmd = null;
    		// Create the customer's list
    		Customers clients = new Customers();
    		//clients.setInputBuffer(IN);
    		while (true)
    		{
    			//****** là j'appelle la 1ere fonction qui lit le fichier en entrée *****
    			cmd = DispMenu();
    			// if the user wants to quit
    			if(cmd.toUpperCase().equals("Q")) {
    				[...]
    			} else {
    				switch(Integer.parseInt(cmd))
    				{
    					case 1 :
    						//****** là j'appelle la 2e fonction qui attends une entrée de la part de l'utilisateur (c'est là que ça plante *****
    						clients.selectFile();
    						break;
    					case 2 :
    					[...]
     
    				}
    			}
    		}
    	}
    1ere fonction dans laquelle je crée mon BufferedReader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    	public static String DispMenu() {
    		//******* Là je crée mon 1er buffer *******
    		BufferedReader IN = null;
    		try {
    			// Redirecting System.in to IN
    			IN=new BufferedReader(new InputStreamReader(System.in));
    		} catch(Exception e) {
    			System.err.println("Error :" + e);
    		}
     
    		// cmd will receive user's input
    		String cmd;
    		do
    		{
    			// reset cmd var
    			cmd = null;			
    			// Disp choices
    			menuSelection();
    			try {
    				// ******** Là je récupère la frappe du clavier *****
    				cmd = IN.readLine();
    			} catch(Exception e) {
    				System.err.println("Error :" + e);
    			}
    		// While the {1,2,3,q,Q} key is pressed, keep displaying the menu	
    		} while(!cmd.toUpperCase().equals("Q") && !cmd.equals("1"));
     
    		// ***** là je renvoie le résultat (qui doit etre 1 ou q) au main *****
    		return cmd;
    	}
    2e fonction qui retourne une null pointer exception, car le BufferedReader est nul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    	public boolean selectFile(String type) {
    		String cmd = null;
    		String create = null;
    		File file = null;
    		do
    		{	
    			file = null;
    			cmd = null;
    			IN = null;
    			System.out.print("Enter the input file " +
    					"or press 'q' to exit: ");
    			try {
    				//******* Là je crée un autre buffer *******
    				this.IN=new BufferedReader(new InputStreamReader(System.in));
    			} catch(Exception e) {
    				System.err.println("Error :" + e);
    			}
    			// reading user's cmd from keyboard
    			try {
    				cmd = IN.readLine();
    			} catch(Exception e) {
    				System.err.println("Can't read from the Keyboard :(.\nErr:" + e);
    			}
    			// testing if the file exists
    			//******* Apres la ligne suivante, je me retrouve avec un null pointer exception *******
    			file = new File(cmd);
    			[....]
    		}
    	}
    Je vous met l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    5 - Compute interests
    6 - Add an account
    Q - Quit
    Enter the input file or press 'q' to exit: Exception in thread "main" java.lang.NullPointerException
            at java.io.File.<init>(File.java:194)
            at Customers.selectFile(Customers.java:88)
            at lab3.main(lab3.java:46)
    Ainsi que le fichier contenant les commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1
    customers.txt
    2
    3
    [...]
    Voilà, maintenant comme le disait adiGuba, je pense que le problème vient des BufferdReader que je crée dans chaque fonction.
    Mais je ne vois pas trop d'alternative, faudrait il que je crée un seul BufferedReader dans le main, et que je le passe en paramètre de toutes mes fonctions ?
    Je suis sur qu'il doit bien y avoir une autre solution !

    Si vous avez une idée ou une piste, celle ci est la bienvenue ;p

  7. #7
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Si tu effectues un deuxième readLine() dans ta méthode selectFile, tu reçois le nom du fichier.

    La solution?

    Evite de mélanger interaction utilisateur et traitement.
    Sépare les responsabilités en créant des classes.

    une classe pour l'interaction avec l'utilisateur.
    une ou plusieurs classes pour le traitement.
    Bien le bonjour chez vous
    Jowo

  8. #8
    Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Oki, je te remercie ;p
    Je vais recoder mon prog en séparant les interfaces.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sauvegarder le flux d'entree d'une sous-routine
    Par Slaab dans le forum Fortran
    Réponses: 0
    Dernier message: 05/06/2012, 18h24
  2. redirection de port sous LINUX
    Par bounns dans le forum Réseau
    Réponses: 1
    Dernier message: 15/10/2007, 18h02
  3. system et redirection sortie standard sous linux
    Par Choupinou dans le forum Linux
    Réponses: 14
    Dernier message: 11/01/2007, 23h25
  4. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo