2010-06-28 6 views
6

Une connexion PipedInputStream/PipedOutputStream fonctionne très bien lorsque les données doivent uniquement être acheminées vers une sortie, mais si plusieurs flux de sortie sont connectés à un flux d'entrée, les données deviennent fragmenté entre les différentes sorties. Ma solution actuelle implique d'avoir un "lecteur" threadé qui lit les données d'un InputStream et écrit ensuite les données dans les objets OutputStream qui ont été associés au lecteur. Cela semble fonctionner, mais il semble désordonné et inefficace par rapport aux classes natives PipedIO.Meilleure façon de canaliser les données d'un flux d'entrée vers plusieurs flux de sortie

Y a-t-il une meilleure façon de gérer cela ou est-ce que l'implémentation avec laquelle je travaille est aussi bonne que je vais le faire?

Répondre

1

Si un flux d'entrée doit être lu par plusieurs consommateurs et que le flux d'entrée est éphémère (c'est-à-dire qu'il ne peut pas être rembobiné ou prend en charge plusieurs pointeurs d'entrée), vous devez généralement fournir un tampon. qui se comporte comme s'il conservait chaque élément de données jusqu'à ce que tous les consommateurs l'aient lu.

Vous avez plusieurs choix d'implémentation. Le plus simple est ce que vous suggérez, le surcoût étant principalement l'espace de stockage pour plusieurs copies des données dans les tampons de sortie. Si le stockage est un problème, vous pouvez fournir un seul tampon qui maintient des pointeurs de lecture distincts, un pour chaque consommateur, et conserve en mémoire uniquement les données entre les pointeurs de lecture les plus bas et les plus élevés. Si les consommateurs lisent des données à des vitesses très différentes, vous pouvez toujours vous retrouver avec la plupart ou la totalité des données d'entrée en mémoire, à quel point un certain type de limitation d'entrée, ou schéma intermédiaire de disque, deviendrait nécessaire.

Je suppose que le flux d'entrée unique n'est pas persistant (c'est-à-dire un fichier sur le disque) ... dans ce cas, la solution est triviale.

+0

Merci pour la réponse. Vous avez raison de supposer que les données ne sont pas persistantes. Fondamentalement, je lis les données d'une connexion SSH à des fins de vérification. Je tamponne les réponses de commande afin qu'elles puissent être vérifiées par rapport au comportement attendu, écrire des données dans un journal de débogage si nécessaire et écrire toutes les données dans une interface graphique à des fins de surveillance. Puisque je ne m'inquiète vraiment que de tamponner de petites quantités de données pour la réponse à une commande, je pense que je vais soit m'en tenir à ma méthode actuelle, soit à la méthode multiplex ci-dessus à moins qu'il n'y ait d'autres suggestions. – WeeTodd

0
+0

Merci pour la réponse. Avez-vous des commentaires supplémentaires sur la façon dont cela fonctionnerait lorsque vous devez parler à travers les threads par rapport à ma solution actuelle? J'ai essayé de jouer avec les données d'entrée dans un flux de sortie multiplex, mais les performances semblent être décalées et pas aussi fiables. – WeeTodd

+0

@WeeTodd Vous aurez probablement besoin de comparer les différentes solutions. Je recommanderais d'aller de l'avant et ensuite en regardant différentes options si vous rencontrez des problèmes de perf. Faites en sorte que vous puissiez facilement remplacer les implemntations –

Questions connexes