framework Java NIO pour systèmes de fichiers au lieu des réseaux?
-
13-09-2019 - |
Question
Il existe plusieurs cadres de haute qualité qui masquent la complexité de la programmation de réseau basé sur NIO (mina, Netty, grizzly, etc.). Y at-il des cadres similaires qui simplifient la programmation du système de fichiers basé NIO?
Par exemple, comme un exercice d'apprentissage, je voudrais mettre en œuvre un disque sauvegardé carte basé sur cet article (génial!): http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.html .
La solution
Non (mais ...)
Mais c'est parce que NIO Java FileChannel et MappedByteBuffer ne sont pas presque aussi complexe ou difficile à comprendre et à utiliser la mise en réseau et sélecteur de la java.nio
stuff.
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 . Les données se déplacent rapidement et par magie 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. Vous avez un certain contrôle de ce fait, cependant. Par exemple: .force()
( Force toute modification apportée au contenu de ce tampon à écrire sur le périphérique de stockage contenant le fichier mis en correspondance. ) et .load()
( Les charges de contenu de ce tampon dans la mémoire physique. ) Je ne l'ai jamais besoin de ces personnellement.
Autres conseils
Pour ajouter @ commentaire de Stu. Il convient de noter que les connexions socket ne sont pas toutes leurs données à la fois, mais peuvent plutôt besoin de supporter plusieurs connexions lentes (esp connexions qui sont ouvertes, mais aucune donnée n'est encore envoyé)
Cependant, pour les fichiers, toutes les données sont disponibles à la fois et vous généralement seulement besoin d'ouvrir quelques fichiers à la fois pour obtenir une performance maximale (souvent un à la fois est très bien) Si vous chargez des données à partir de plusieurs disques (rares ) ou à partir de plusieurs serveurs (très rares) ou plusieurs interfaces réseau (encore plus rare), vous pouvez accéder à FiNE quelques fichiers à la fois d'améliorer les performances. Même alors la complexité n'est pas élevé et vous pouvez simplement créer un thread pour chaque fichier que vous chargez.
La seule fois où les fichiers sont compliqués est la lecture des fichiers journaux. Cela a compliqué que le fichier peut croître en taille que vous lisez. Vous pouvez arriver à la fin des fichiers et trouver plus tard plus de données. également consigner les fichiers peuvent être mis en rotation qui signifie que le fichier que vous aviez ouvert n'est plus le fichier que vous voulez. ce n'est pas très difficile, même si à traiter et une exigence assez rare.