Il existe plusieurs frameworks de haute qualité qui masquent la complexité de la programmation réseau basée sur NIO (mina, netty, grizzly, etc.). Existe-t-il des cadres similaires qui simplifient la programmation du système de fichiers NIO? Par exemple, en tant qu'exercice d'apprentissage, je voudrais implémenter une carte sauvegardée sur disque basée sur cet article (impressionnant!): http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.html.Java NIO cadre pour les systèmes de fichiers au lieu de réseaux?
Répondre
Non (mais ...)
Mais c'est parce que Java NIO de FileChannel et MappedByteBuffer ne sont pas presque aussi à comprendre et à utiliser complexes ou difficiles la mise en réseau et Selector choses java.nio
.
Voici un exemple de création d'un disque carte soutenu (connu comme un « tampon d'octets cartographié » dans NIO-terre) qui serait approprié pour votre exercice:
File file = new File("/Users/stu/mybigfile.bin");
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_WRITE, 0, file.length());
Vous pouvez accéder à la mémoire tampon comme tout autre Buffer. Les données se déplacent magiquement et rapidement entre le disque et la mémoire, toutes gérées par Java et le système de gestion de la mémoire virtuelle du système d'exploitation sous-jacent. Cependant, vous avez un certain degré de contrôle. Exemple: .force()
de MappedByteBuffer ('Force les modifications apportées au contenu de ce tampon à être écrites sur le périphérique de stockage contenant le fichier mappé.') et .load()
('Charge le contenu de ce tampon dans la mémoire physique.') Je n'ai jamais besoin de ceux-ci personnellement.
Pour ajouter au commentaire de @ Stu. Il convient de noter que les connexions socket n'ont pas toutes leurs données à la fois mais peuvent avoir besoin de prendre en charge de nombreuses connexions lentes (les connexions ESP sont ouvertes mais aucune donnée n'est encore envoyée). une fois et vous avez généralement besoin seulement d'ouvrir quelques fichiers à la fois pour obtenir des performances maximales (souvent un à la fois est bien) Si vous chargez des données à partir de plusieurs disques (rares) ou de plusieurs serveurs (très rare) ou plusieurs interfaces réseau (encore plus rare) vous pourriez bien accéder à quelques fichiers à la fois améliore les performances. Même dans ce cas, la complexité n'est pas élevée et vous pouvez simplement créer un thread pour chaque fichier que vous chargez.
La seule occasion où les fichiers sont compliqués est la lecture des fichiers journaux. C'est compliqué car le fichier peut grossir au fur et à mesure que vous le lisez. Vous pouvez atteindre la fin des fichiers et plus tard trouver plus de données. Les fichiers journaux peuvent également être pivotés, ce qui signifie que le fichier que vous avez ouvert n'est plus le fichier que vous voulez. Même si ce n'est pas très difficile à traiter et une exigence assez rare.
+1: très bon point sur le connecteur de socket –