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

avec Java Discussion :

Quel streams utiliser ?


Sujet :

avec Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Quel streams utiliser ?
    Bonjour,

    Je veux créer une application qui doit récupérer du texte et en fonction de ce contenu, créer un JTree (=> j'attends d'avoir récupéré toutes les données avant de construire le JTree : ce n'est pas une construction dynamique de l'arbre mais peut-être que dans le futur je le ferais).
    Le text sera issu soit d'une textbox, soit d'un fichier : par la suite, je développerait peut-être la gestion d'autres sources comme un flux Ethernet ou USB.

    je pensais donc diviser mon projet en plusieurs étapes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1- récupération du flux d'entrée (fichier, textbox, autre...)
    2- conversion du flux d'entrée en un flux standard (je voudrais une chaine de texte facilement visible pour pouvoir faire des fonctions de debug dessus)
    3- conversion du flux standard en flux d'objet pour le JTree ()
    4- construction du JTree en utilisant le flux d'objet
    => quels sont les différents type de flux que je dois utiliser pour chaque étape (pour le moment on dira que le flux d'entré est une textBox) ?

    merci d'avance,

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    1 -> ca dépendra de ta source (fichier: fileinputstream, socket réseau: socketinputstream, données en mémoire: bytearrayinputstream, ....)
    2 -> Qu'est-ce que tu appelle "flux standard"?
    3 -> pourquoi un "flux d'objet" et pas simplement ajouter les objet directement au tree? C'est quoi pour toit un "flux d'objets" ?
    4 -> idem 3

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    1 -> ca dépendra de ta source (fichier: fileinputstream, socket réseau: socketinputstream, données en mémoire: bytearrayinputstream, ....)
    2 -> Qu'est-ce que tu appelle "flux standard"?
    3 -> pourquoi un "flux d'objet" et pas simplement ajouter les objet directement au tree? C'est quoi pour toit un "flux d'objets" ?
    4 -> idem 3
    Salut,

    2 -> un flux qui contient du text (chaque ligne correspond à un élément de mon arbre)
    3 -> oui effectivement, en faisant mon programme je me suis rendu compte qu'il faut plutot faire une fonction ajouter

    Donc voici mon code acuelle
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    	// **************************************************************
    	private CharArrayWriter caw = new CharArrayWriter();
    	private CharArrayReader car;
     
     
     
     
    	// *****************************************************
    	// TODO : comment les déclarer dans la fonction ???
    	private String pStr;
    	private short pStateMachine = 0; // machine d'etat 
     
    	// recupère une ligne dans le Stream et crée l'objet pour le JTree
    	private void convertStreamText2TreeElmnt() throws IOException{
    		int i;
    		char myChar;
     
     		switch (pStateMachine){
    			case 0: // initialisation
    				pStr = "";
    				pStateMachine++;
     
    			case 1: // récupération d'une ligne
    				while((i=car.read()) >= 0){
     
    					myChar = (char)i;
     
    					if (myChar == '\n'){ 
    						if (pStr.length() != 0){
    							System.out.println(pStr); // affichage de la ligne pour le debug
    							//JtreeAdd(myStr); // ajout d'un élément dans le JTree
    						}
     
    						pStateMachine = 0;
    						return;
    					}
    					pStr += myChar;
    				}
     
    				if(i == -1){ // fin de fichier
    					if (pStr.length() != 0){
    						System.out.println(pStr); // affichage de la ligne pour le debug
    						//JtreeAdd(myStr); // ajout d'un élément dans le JTree
    					}
     
    					pStateMachine = 0;
    					return;
    				}
    				break;
    		}
    	}
     
     
    	// *****************************************************
    	// simule la reception de charactères
    	void setDataText(String str){
    		for(int i = 0; i<str.length(); i++){
    			caw.write(str.charAt(i));
    		}
    	}

    Et je l'ai testé comme ça (ça m'affiche chaque ligne dans la console) :
    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
            System.out.println("start");
     
     
            setDataText("salut !");
            setDataText("ça va ?\n");
            setDataText("oui et toi ?");
     	   	car = new CharArrayReader(caw.toCharArray());
     
            //caw.close();
     
            try {
    			convertStreamText2TreeElmnt();
    			convertStreamText2TreeElmnt();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
            setDataText("yo !!!!");
    	   	car = new CharArrayReader(caw.toCharArray());
     
            try {
    			convertStreamText2TreeElmnt();
    			convertStreamText2TreeElmnt();
    			convertStreamText2TreeElmnt();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    start
    salut !ça va ?
    oui et toi ?
    salut !ça va ?
    oui et toi ?yo !!!!

    => je ne vois pas trop comment faire pour :
    1- ne pas relire les caractères que j'ai déja lu
    Car lorsque je fais un pour récupérer les dernière données reçu :
    car = new CharArrayReader(caw.toCharArray());
    => ça réinitialise au début du tampon le pointeur du flux

    2- supprimer les caractères déjà lu de la mémoire tampon du flux (pour éviter de consommer de la mémoire pour rien)
    3- lors de la première séquence d'affichage, "oui et toi ?" apparait => je ne comprend pas pourquoi (il n'y a pas de '\n' dans la chaine => comment détecté si le flux est fermé ou en cours de remplissage ?)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu dois regrouper 1 et 2 dans tes points en haut pour finir avec un BufferedReader (le plus simple).


    Exemple, si lecture d'un fichier encodé en utf-8:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream s = new FileInputStream("chemin/vers/fichier.txt");
    BufferedReader r = new BufferedReader(new InputStreamReader(s,"UTF-8"));
    String line=null;
    while((line=r.readLine())!=null){
       // ajouter
    }
    Si lecture d'un String déjà existante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String ligne="du texte\n et encore du texte";
    BufferedReader r = new BufferedReader(new StringReader(ligne));
    String line=null;
    while((line=r.readLine())!=null){
       // ajouter
    }
    Etc, etc

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    désolé mais je n'ai toujours pas bien compris comment faire
    => je ne vois pas comment écrire dans le buffer si les commandes de lecture et d'écriture ne sont pas synchrone (pour lire un fichier ou une String fixe, j'ai compris)

    donc a priori ma fonction de lecture sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	StringReader sr = new StringReader("");
     
    	// recupère element pour le JTree dans le buffer
    	void getTreeElm() throws IOException{ 
    		BufferedReader r = new BufferedReader(sr);
    		String line=null;
     
    		while((line=r.readLine())!=null){
    			System.out.println(line); // affichage de la ligne pour le debug
    			//JtreeAdd(myStr); // ajout d'un élément dans le JTree
    		}
    	}
    mais comment sera ma fonction d'écriture dans sr ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    on écrit pas dans un reader! Ca sert à la lecture!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    mais alors comment faut-il que je fasse ?
    Dois-je me créer un buffer tampon (tableau de bytes) et tout gérer à la mimine (et donc oublié tout les objets type Stream que propose java) ?

    En gros je veux créer :
    - 1 fonction putInBuffer qui permet de mettre les données dans le buffer (dont le code dépend du périphérique d'entrée utilisé)
    - 1 fonction getInBuffer qui récupère les données dans le buffer (ligne par ligne) et qui crée à la volé mon arbre
    Par exemple si le périphérique d'entrée est le port COM1, il faudrait faire comment ?

  8. #8
    Membre éclairé Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Points : 676
    Points
    676
    Par défaut
    Bonjour,

    pourquoi avoir une fonction "metre dans le buffer" c'est ton inputStream qui gere ca!

    si tu veux lire dans un fichier tu utilise un FileInputStream, si sa vien du reseau l'InputStream de la socket, si sa viens de textArea un StringReader, ...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok, je vais tester
    merci

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le seul cas où tu dois mettre tois même dans le buffer au fur et à mesure c'est, par exemple, lorsque tu reçois par autre chose que des stream tes données d'origine. Exemple: t'as un textfield et à chaque fois qu'on clique sur un bouton faut ajouter ce textfield au stream déjà existant. Dans ce cas, on utilise des PipedOutputStream et des PipedInputStream qui permettent de lier un inputstream à un outputstream (on lit dans l'un ce qui est écrit dans l'autre).

    Dans le cas de ton com1, ce n'est pas nécessaire, tu va déjà récupérer un inputstream sur le com1, donc pas besoin de chipoter.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok, merci pour les infos

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

Discussions similaires

  1. [JEditorPane] Quel listener utiliser?
    Par Pill_S dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 27/07/2004, 13h32
  2. [Parser HTML] quel parser utiliser pour du HTML 4.0 ?
    Par Cyber@l dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/07/2004, 19h32
  3. [Debutant(e)]Quel composant utiliser pour faire une grille
    Par elitost dans le forum Composants
    Réponses: 7
    Dernier message: 21/06/2004, 20h44
  4. Réponses: 3
    Dernier message: 27/08/2003, 21h14
  5. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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