2009-11-25 4 views
2

Actuellement, je suis en utilisant un ObjecInputStream à lire à partir d'un Socket, et tout fonctionne très bien en utilisant ce code simple:annuler une lecture d'un InputStream

ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); 
Object response = input.readObject(); 

Maintenant, je veux annuler en quelque sorte la lecture, sans fermer le flux , de sorte que je puisse en lire plus tard. C'est possible?

Édition: Je souhaite annuler la lecture simplement parce qu'elle bloque le déroulement du programme. Je n'ai pas besoin de lire la même information deux fois. Je veux juste l'annuler afin que je puisse envoyer une autre demande et ensuite lire la (autre) réponse.

+1

J'ai l'impression qu'il existe plusieurs façons d'interpréter votre question en fonction des réponses reçues jusqu'à maintenant. Cherchez-vous à annuler le readObject() [car il bloque] et pouvoir le rappeler plus tard? Ou bien les autres affiches l'ont-elles corrigé correctement et vous cherchez juste un moyen de relancer le flux (bien qu'il faille encore trouver un moyen de sortir de readObject()). – PSpeed

+0

Merci PSpeed, s'il vous plaît voir ma mise à jour :) – phunehehe

Répondre

2

Si vous avez un type de thread "principal", vous devez effectuer une E/S. Avoir un fil dédié à la lecture et à certains étend le traitement de l'entrée. Soit mettre en file d'attente les résultats dans le thread principal si l'événement est basé, sur modifier le modèle si vous utilisez un design d'état partagé.

2

Voir ce que ObjectInputStream.markSupported() renvoie. S'il renvoie true, vous pouvez appeler ObjectInputStream.mark() au début, puis appeler le ObjectInputStream.reset() pour rembobiner le InputStream à l'endroit que vous avez marqué afin de pouvoir le réutiliser plus tard.

+0

alors, que faire si elle renvoie faux? BTW Je ne veux pas lire les mêmes données deux fois, je veux juste annuler la lecture afin que je puisse envoyer une autre demande, puis lire une autre réponse. – phunehehe

+0

@phunehehe: Si elle renvoie 'false' alors mark/reset n'est pas supporté par ce' InputStream' et cette stratégie ne fonctionnera pas pour vous. Quoi qu'il en soit, si vous ne relisez pas deux fois les mêmes données (non mentionnées dans la question initiale), la stratégie ne s'appliquera pas de toute façon. Pourquoi n'instanciez-vous pas simplement un nouveau 'ObjectInputStream'? L'instanciation d'objet est bon marché ces jours-ci. – Asaph

+0

Mais le programme bloque quand je fais un autre appel à 'input = new ObjectInputStream (socket.getInputStream());' Je pense que ça doit être un problème avec l'ancien flux (en fait je pense que ce sont les mêmes flux du même socket) . Dois-je créer une autre socket? – phunehehe

1

Pour ce faire, vous pouvez utiliser un PushBackInputStream. Après avoir lu quelques octets, vous pouvez lire les octets.

+0

Merci, s'il vous plaît voir mon edit – phunehehe