[java] probleme avec InputStream
karine
-
Utilisateur anonyme -
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
le probleme c'est que le deuxieme inputstream est vide !
le premier a pris toutes les données.
Comment faire ?
Merci
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
-
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 -
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 ^^' -
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 ! -
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 ! -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
c'est en effet un peu confus ...
-
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 ! -
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. -
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 -
salut
ton objet SequenceInpustream attend-t'il bien un objet de type énumaration dans son constructeur ?
-
-
c'est ça ..
<? extends java.io.InputStream>
que je comprends pas dans l'erreur
-