[java] probleme avec InputStream

Fermé
karine - 24 mai 2005 à 15:26
 Utilisateur anonyme - 28 juin 2005 à 10:54
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
A voir également:

12 réponses

Utilisateur anonyme
28 juin 2005 à 10:54
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
TuXor Messages postés 97 Date d'inscription lundi 23 mai 2005 Statut Membre Dernière intervention 28 avril 2006 25
24 mai 2005 à 15:32
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
choubaka Messages postés 39420 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 19 février 2025 2 104
24 mai 2005 à 20:42
c'est en effet un peu confus ...
0
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
choubaka Messages postés 39420 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 19 février 2025 2 104
25 mai 2005 à 10:30
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
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
choubaka Messages postés 39420 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 19 février 2025 2 104
25 mai 2005 à 11:44
salut

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

Oui, il admet bien un type Enumeration.

Qu'est-ce que tu en penses ?
0
choubaka Messages postés 39420 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 19 février 2025 2 104
25 mai 2005 à 11:49
c'est ça ..

<? extends java.io.InputStream>

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