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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 822
    Points : 983
    Points
    983
    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 822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 822
    Points : 983
    Points
    983
    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 822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 822
    Points : 983
    Points
    983
    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!

+ 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