Comment savoir si un flux BufferedReader est fermé
J'ai deux threads en Java.
Premier thread est la fermeture d'un bufferedreader (br.close()
)
Lors de la deuxième thread de lecture sur le même lecteur, je reçois un IOException (Stream Closed)
Je bénéficier de cette exception, même si j'utilise br.ready()
Est-il un moyen de savoir si le flux est déjà fermé?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
La méthode
ready()
va lever une exception si elle est fermée. Mais même si vous avez ajouté un fermé méthode de contrôle, tant que le verrou est libéré entre les appels (c'est pourBufferedReader
), le lecteur peut être fermé par le temps de la lire.Je vois trois options:
BufferedReader
qui s'étendclose()
pour définir vos propres variables quepeut être utilisé pour vérifier si le lecteur est fermé. Cela nécessite aussi la substitution d'un lot de
méthodes pour faire ce que le comportement que vous souhaitez fermée du lecteur, si vous voulez faire quelque chose à côté de jeter le
IOException
.vérifier que le tampon est prêt et en lire. Vous pouvez soit définir une variable directement dans la vérification ou simplement pour le
ready()
etread()
des appels dans le même bloc synchronisé.Je ne pense pas qu'une méthode, vous pouvez appeler directement pour savoir si un flux est fermé.
Si vous avez vraiment besoin d'avoir les deux fils de partage de ce lecteur, votre meilleure option pourrait être d'avoir le fil conducteur de retour d'appel à l'autre thread ou définir un indicateur de lui notifier que le flux a été fermé afin que l'autre thread ne sait pas essayer de lire.
Si vous avez déjà commencé une opération de lecture, puis vous recevrez une notification avec une IOException qu'un cours d'eau est fermé. Même si vous l'avez appelé br.prêt() avant, l'exception se produit lorsque votre code est bloqué à la méthode de lecture.
Il n'existe aucun moyen d'éviter cela. Au contraire, vous devriez vous attendre d'une opération de lecture pour lancer une exception et être prêt à gérer de manière appropriée.
Une autre façon serait d'étendre un BufferedReader dans votre propre classe, en substituant la méthode close() pour indiquer si elle a été fermée.
En effet, en regardant ensureOpen() vérifie si le dans objet n'est pas null.
Depuis qu'il est privé, nous ne pouvons pas y accéder de l'extérieur.
Mais si vous en avez vraiment besoin, vous pouvez utiliser la réflexion.
Si seulement les choses qui lisent BufferedReader et de proximité sont à votre fils, je voudrais juste faire synchronisé section et certains à plat lors de la fermeture du Lecteur. Ainsi, dans chaque thread, vous devez:
Juste être prudent et éviter tout ce qui pourrait se bloquer dans synchronisé section. Fondamentalement mis là seulement ce qui est nécessaire, uniquement lire les données, les traiter plus tard.