Maison  >  Article  >  Java  >  La différence et les scénarios applicables entre NIO et IO en Java

La différence et les scénarios applicables entre NIO et IO en Java

伊谢尔伦
伊谢尔伦original
2017-04-29 12:54:462503parcourir

NIO est né pour combler les lacunes des opérations d'E/S. Certaines des nouvelles fonctionnalités de NIO sont : les E/S non bloquantes, les sélecteurs, les tampons et les canaux. Channel, Buffer et Selector sont ses principales fonctionnalités.

Explication du concept :

Channel - Les tuyaux sont en fait comme des flux dans les IO traditionnelles, toutes les données vers n'importe quelle destination (ou depuis n'importe où) doivent passer par un objet Channel. Un Buffer est essentiellement un objet conteneur.

Sélecteur - Le sélecteur est utilisé pour écouter les événements de plusieurs canaux. Lors de l'utilisation d'E/S bloquantes traditionnelles, nous pouvons facilement savoir quand la lecture et l'écriture peuvent être effectuées. Cependant, en utilisant des canaux non bloquants, nous avons besoin de certaines méthodes pour le faire. savoir quoi Lorsque la chaîne est prête, le sélecteur est né pour ce besoin.

Quelle est la différence entre NIO et IO traditionnel

1. IO est orienté flux et NIO est orienté bloc (tampon).

Les opérations orientées flux IO traitent les données un octet à la fois. Un flux d'entrée produit un octet de données et un flux de sortie consomme un octet de données. , ce qui entraîne une mauvaise efficacité de lecture et d'écriture des données ;

Les opérations orientées bloc NIO génèrent ou consomment un bloc de données en une seule étape. Le traitement des données en morceaux est beaucoup plus rapide que le traitement des données en octets (en streaming), tandis que les données sont lues dans un tampon qu'elles traitent plus tard et peuvent être déplacées d'avant en arrière dans le tampon selon les besoins. Cela augmente la flexibilité du traitement. En termes simples, NIO adopte une méthode de « pré-lecture » lorsque vous lisez une certaine partie des données, il devinera les données que vous pourrez lire ensuite et les mettra en mémoire tampon à l'avance.

2. IO bloque et NIO ne bloque pas.

Pour les IO traditionnelles, lorsqu'un thread appelle read() ou write(), le thread est bloqué jusqu'à ce que certaines données soient lues ou que les données soient complètement écrites. Le fil ne peut rien faire d'autre pendant cette période.

Pour NIO, un thread est utilisé pour envoyer une demande de lecture de données. Avant d'obtenir une réponse, le thread est inactif à ce moment-là, le thread peut effectuer d'autres tâches au lieu d'attendre simplement que la réponse soit terminée. comme dans IO.

Scénarios applicables NIO et IO

NIO est né pour compenser les défauts de l'IO traditionnel, mais il a ses défauts et ses points forts car NIO est orienté vers le tampon. Opération, chaque traitement de données est effectué sur le tampon, il y aura alors un problème avant le traitement des données, il faut juger si les données dans le tampon sont complètes ou si elles ont été lues. Sinon, on suppose que les données ont seulement été lues. partie lue, il ne sert à rien de traiter des données incomplètes. Par conséquent, les données du tampon doivent être détectées avant chaque traitement de données.

Alors, quels sont les scénarios applicables pour NIO et IO ?

Si vous devez gérer des milliers de connexions ouvertes en même temps et que ces connexions n'envoient qu'une petite quantité de données à chaque fois, comme un serveur de chat, alors utiliser NIO pour traiter les données peut être un bon choix.

S'il n'y a qu'un petit nombre de connexions et que ces connexions doivent envoyer une grande quantité de données à chaque fois, les IO traditionnelles sont plus adaptées. La méthode à utiliser pour traiter les données doit être mise en balance avec le temps d'attente de réponse des données et le temps de vérification des données du tampon.

Explication populaire

Enfin, pour NIO et IO traditionnel, il existe un exemple frappant mentionné par un internaute :

Le flux précédent était toujours bloqué, et un fil de discussion suffisait à Si vous effectuez une opération, les autres opérations seront bloquées, ce qui équivaut à une conduite d'eau sans valve. Lorsque vous tendez la main pour recevoir de l'eau, que l'eau arrive ou non, vous ne pouvez consacrer du temps qu'à recevoir de l'eau (. couler).

L'ajout du canal nio équivaut à l'ajout d'un robinet (avec une valve). Bien qu'il ne puisse recevoir l'eau que d'un seul tuyau d'eau à la fois, il s'appuie sur la stratégie de rotation lorsque le volume d'eau n'est pas atteint. grand, l'eau qui coule dans chaque conduite d'eau L'eau qui sort peut être correctement reçue. Le point clé est d'ajouter un collecteur d'eau, c'est-à-dire que le sélecteur est responsable de la coordination, c'est-à-dire s'il y a de l'eau dans l'un d'entre eux. conduite d'eau, au moment où l'eau dans la conduite d'eau atteint un certain niveau, changez-la : fermez temporairement le robinet actuel et essayez d'ouvrir l'autre robinet (pour voir s'il y a de l'eau).

Lorsque d'autres personnes ont besoin d'eau, elles ne vont pas simplement chercher l'eau directement, mais fournissent à l'avance un seau au collecteur d'eau. Ce seau est le tampon. C'est-à-dire que même si d'autres personnes devront peut-être attendre, elles n'attendront pas sur place, mais rentreront chez elles et attendront. Elles peuvent faire

d'autres choses. Lorsque l'eau est pleine, le collecteur d'eau. les informera.

C'est en fait très proche de la réalité de la division sociale actuelle du travail. C'est également un moyen très économique d'utiliser uniformément les ressources existantes pour obtenir des effets simultanés, plutôt que de simplement effectuer un traitement parallèle à chaque instant. c'est le moyen le plus efficace, mais aussi le moyen le plus inutile de

ressources.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn