web-dev-qa-db-fra.com

Java: quelle est exactement la différence entre NIO et NIO.2?

Je ne comprends pas très bien à quel point ils sont différents les uns des autres, alors je me renseignerai sur ces deux forfaits.

Après quelques recherches sur Google, il semble qu'Oracle ait décidé de mettre à jour le paquet NIO avec la version plus récente et améliorée NIO.2 package dans le cadre de la version JDK7.

  1. Comment les performances du package NIO se comparent-elles à celles du package NIO.2 paquet?
  2. Quels sont les grands changements de NIO à NIO.2? (par exemple, nouvelles méthodes, fonctionnalités)
  3. Pourquoi le paquetage original NIO doit-il être mis à jour?
  4. Est NIO.2 juste avec le paquet NIO de nos jours?

Ce n'est pas que je veuille utiliser le paquetage hérité dans mon code, je suis vraiment curieux à ce sujet. S'il vous plaît dites-moi leurs différences?

72
John Huynh

Java a commencé par offrir la classe File, dans la classe Java.io package pour accéder aux systèmes de fichiers. Cet objet représente un fichier/répertoire et vous a permis d'effectuer certaines opérations telles que vérifier si un fichier/répertoire existe, obtenir les propriétés et le supprimer. Il y avait cependant quelques lacunes. Pour en nommer quelques uns:

  • La classe File manquait de fonctionnalités importantes, telles qu'une méthode de copie.
  • Il a également défini de nombreuses méthodes qui retournaient boolean. Comme on peut l'imaginer, en cas d'erreur, false a été renvoyé, plutôt que de lancer une exception. Le développeur n'avait en effet aucun moyen de savoir pourquoi cela avait échoué.
  • N'a pas fourni une bonne gestion du support des liens symboliques.
  • Un ensemble limité d'attributs de fichier a été fourni.

Pour résoudre ces problèmes, le package Java.nio a été introduit dans Java 4. Les principales fonctionnalités sont les suivantes:

  • Canaux et sélecteurs: un canal est une abstraction des fonctionnalités de système de fichiers de niveau inférieur, par exemple. fichiers mappés en mémoire.
  • Buffers: mise en mémoire tampon pour toutes les classes primitives (à l'exception de Boolean).
  • Jeu de caractères: Jeu de caractères (Java.nio.charset), encodeurs et décodeurs pour mapper des octets et des symboles Unicode

Avec Java 7, le package Java.nio.file est introduit, offrant une meilleure prise en charge de la gestion des liens symboliques, de l’accès aux attributs de fichier et spécialement de la prise en charge étendue du système de fichiers via des classes telles que Path, Paths et Files. Vous voudrez peut-être jeter un oeil à description du paquet Java.nio.file pour obtenir plus de détails à ce sujet.

Avec ça en tête:

Quels sont les grands changements de NIO à NIO.2? (par exemple, nouvelles méthodes, fonctionnalités)?

Ils servent des objectifs différents. Pour signaler les changements importants, vous pouvez consulter le tout nouveau package Java.nio.file.

Pourquoi le package NIO d'origine a-t-il dû être mis à jour?

Ça n'a pas. Un nouveau paquet a été introduit plutôt que mis à jour.

NIO.2 est-il simplement synonyme du package NIO de nos jours? Comment les performances du package NIO se comparent-elles au package NIO.2?

Non, ils ne sont pas synonymes. Par ailleurs, il n’a pas beaucoup de sens de comparer les performances entre eux, car ils servent des objectifs différents. NIO, une E/S de données de bas niveau plus abstraite et NIO2 axée sur la gestion de fichiers.

J'espère que cela t'aides.

[Bibliographie: Oracle Certified Professional Java SE7 - Guide de certification OCJP7 complet, par S.G.Ganesh et Tushar Sharma - Chapitre 9]

78
Sousa Gaspar

NIO.2 introduit entrée/sortie asynchrone.

Les E/S asynchrones constituent une approche des E/S non bloquantes non prise en charge par NIO.

NIO: sélecteurs/modèle de réacteur

NIO.2: gestionnaires d'achèvement/ modèle proactor

Ainsi, sous Windows, NIO.2 utilise des ports d’achèvement d’E/S , ce qui devrait améliorer les performances. Sauf que personne ne le sait, car personne n'utilise Windows côté serveur, et s'ils le font, ils le font probablement parce qu'ils investissent énormément dans .net et que, pour cette raison, ils n'envisageront probablement pas d'utiliser Java.

46