[java] probleme avec InputStream

karine -  
 Utilisateur anonyme -
Bonjour,

Voici mon probleme :
je reçois des données d'une socket. Et je voudrais effectuer deux traitements différents sur cette socket.

Je fais donc deux inputstream
InputStream i = socket.getInputStream();
InputStream j = socket.getInputStream(); 
InputStreamReader input = new InputStreamReader(i);	
fromWebBin = new DataInputStream(new BufferedInputStream(j));

le probleme c'est que le deuxieme inputstream est vide !
le premier a pris toutes les données.

Comment faire ?
Merci

12 réponses

  1. Utilisateur anonyme
     
    A ta place, je créerai une classe qui étend la classe Thread.

    Exemple:

    public class HandlingThread extends Thread {
    	private StringBuffer buffer;
    	private String lineToHandle;
    	private boolean isActive;
    
    	public HandlingThread() {
    		super();
    		isActive = false;
    	}
    
    	public void run() {
    		isActive = true;
    		while (isActive) {
    			if(lineToHandle!=null){
    				handleInput(lineToHandle);
    				lineToHandle=null;
    			}
    		}
    	}
    	
    	private void handleInput(String input){
    		//A implémenter par toi
    	}
    
    	
    	public synchronized void addLine(String text){
    		lineToHandle = text;
    		buffer.append(lineToHandle);
    		buffer.append("\n\r");
    	}
    }
    


    Modifie ceci dans ton code:

    InputStream i = socket.getInputStream();
    HandlingThread hTh = new HandlingThread();
    hTh.start();
    		
    while (true) {
        str=readLine(fromWebBin);
        hTh.addLine(str);
    }
    


    De cette manière, tu gardes une copie de l'input complet dans le thread et celui-ci effectue le traitement voulu de manière synchronisée.

    ;-)
    HackTrack
    1
  2. TuXor Messages postés 97 Statut Membre 25
     
    Salut, tu peux deja essayer de faire au plus simple,
    par exemple de copier les données dans un tampon avant de les utiliser; et ainsi pouvoir les dupliquer a volonté.

    si tu peux les récuperer sous forme de string, il ne devrait pas y avoir de problème.

    En espérant ne pas dire de conneris ^^'
    0
  3. karine
     
    Mais moi je tiens à avoir un InputStream.
    Je crois que je vais modifier mon constructeur pour qu'il renvoie ce qu'il a lu au deuxième.

    Ca pourrait marcher ...

    Merci quand meme TuXor !
    0
  4. karine
     
    En fait, je suis un peu bloquée.

    J'ai donc ça :
    InputStream i = socket.getInputStream();
    fromWebBin = new DataInputStream(new BufferedInputStream(i));
    
    while (true) {
    	   str=readLine(fromWebBin);
    }
    


    Comment je peux faire pour sauvegarder le str dans un truc du genre outputstream pour ensuite le retransformer en inputstream pour le deuxieme traitement ?

    Je sais pas si je suis très claire ...

    Merci beaucoup !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    c'est en effet un peu confus ...
    0
  7. karine
     
    Essayons de clarifier un peu ...

    J'ai un inputStream, que j'utilise d'abord avec fromWebBin pourle lire et faire un certain traitement dessus que je ne vous ai pas mis ici.
    InputStream i = socket.getInputStream();
    fromWebBin = new DataInputStream(new BufferedInputStream(i));
    		
    while (true) {
    	    		str=readLine(fromWebBin);
    }
    


    Et avec ce même inputStream, je voudrais appeler le constructeur de ma classe Interpreteur.
    InputStreamReader input = new InputStreamReader(i);
    Interpreteur interprete = new Interpreteur(input, url); 
    


    Problème !
    input est vide ! Le premier traitement a "aspiré" toutes les données.

    Ce que je voudrais faire :
    faire passer les infos lues par fromWebBin à mon Interpreteur sous forme d'un InputStreamReader.

    Est-ce que c'est plus clair ? Et comment faire ça ?
    Merci !
    0
  8. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    Salut

    il est fort probable que c'est un problème de visibilité... voir oùtu as déclaré ton inputstream. Peut être est-il nécessaire de le déclarer en attribut de classe et non pas dans une méthode.
    0
  9. karine
     
    J'ai trouvé une technique qui pourrait peut etre marcher mais j'ai une erreur à la compilation.

    InputStream i = socket.getInputStream();
    fromWebBin = new DataInputStream(new BufferedInputStream(i));
    		
    Vector<String> vecFlux = new Vector<String>();
    		
    		
    while (true) {
    	    str=readLine(fromWebBin);
    			
    			
            vecFlux.add(str);
    }
    Enumeration listeFlux = vecFlux.elements();
    SequenceInputStream poeme = new SequenceInputStream(listeFlux);
            		
    InputStreamReader input = new InputStreamReader(poeme);
    Interpreteur interprete = new Interpreteur(input, url); 
            
    


    et là j'ai l'erreur :
    Sources/Clients.java:391: warning: [unchecked] unchecked conversion
    found : java.util.Enumeration
    required: java.util.Enumeration<? extends java.io.InputStream>
    SequenceInputStream poeme = new SequenceInputStream(listeFlux);
    ^
    1 warning

    Est-ce que quelqu'un comprends ce que ça veut dire?

    merci
    0
  10. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    salut

    ton objet SequenceInpustream attend-t'il bien un objet de type énumaration dans son constructeur ?
    0
  11. karine
     
    Resalut choubaka !

    Oui, il admet bien un type Enumeration.

    Qu'est-ce que tu en penses ?
    0
  12. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    c'est ça ..

    <? extends java.io.InputStream>

    que je comprends pas dans l'erreur
    0
  13. lacour
     
    J'ai le même genre de problème. Avez vous trouvé une solution??
    0