RandomAccessfile
RandomAccessFile est utilisé pour accéder aux fichiers qui enregistrent les enregistrements de données. Vous pouvez utiliser la méthode Seek () pour accéder aux enregistrements et lire et écrire. La taille de ces enregistrements ne doit pas être la même; Cependant, leur taille et leur position doivent être connues. Cependant, cette classe est limitée aux fichiers de fonctionnement.
RandomAccessFile n'appartient pas aux classes InputStream et OutputStream. En fait, en plus d'implémenter les interfaces Datainput et DataOutput (DatainPutStream et DataOutputStream implémentent également ces deux interfaces), cela n'a rien à voir avec ces deux classes et n'utilise même aucune fonction qui existe déjà dans les classes InputStream et OutputStream; C'est une classe complètement indépendante, et toutes les méthodes (appartenant principalement à elle-même uniquement) sont écrites à partir de zéro. Cela peut être dû au fait que RandomAccessFile peut se déplacer dans le fichier, donc son comportement est quelque peu fondamentalement différent des autres classes d'E / S. En bref, il s'agit d'une classe distincte qui hérite directement de l'objet.
Fondamentalement, la méthode de travail de RandomAccessFile est de combiner DatainputStream et DataOutputStream, et d'ajouter certaines de ses propres méthodes, telles que getFilePointer () pour le positionnement, cherchez () pour se déplacer dans le fichier, et déterminer la longueur () pour la taille du fichier et les skipbytes () pour Skip par le nombre de délégués. De plus, son constructeur a également un paramètre qui indique d'ouvrir le fichier en mode en lecture seule ("r") ou en mode lecture-écriture ("RW") (exactement le même que le fopen () de C). Il ne prend pas en charge les fichiers d'écriture uniquement.
Seul RandomAccessFile a une méthode de recherche de recherche, et cette méthode ne s'applique qu'aux fichiers. BufferedInputStream a une méthode Mark (), que vous pouvez utiliser pour définir la marque (enregistrer le résultat dans une variable interne), puis appeler reset () pour revenir à cette position, mais sa fonction est trop faible et pas très pratique.
La plupart des fonctions de RandomAccessFile, mais pas toutes, ont été remplacées par les "fichiers à mémoire de mémoire" de JDK 1.4. Vous devez considérer s'il faut utiliser des "fichiers mappés de mémoire" au lieu de RandomAccessFile.
Importer java.io.ioException; import java.io.randomaccessfile; classe publique TestRandomAccessFile {public static void main (String [] args) lève ioException {randomaccessfile rf = new randomaccessfile ("rTest.dat", "rw"); pour (int i = 0; i <10; i ++) {// Écrivez le type de base double data rf.writedouble (i * 1.414); } rf.close (); rf = new randomaccessfile ("rTest.dat", "rw"); // Tournez directement le pointeur de fichier vers le 5e double data rf.seek (5 * 8); // écraser le 6e double data rf.writedouble (47.0001); rf.close (); rf = new randomaccessfile ("rtest.dat", "r"); pour (int i = 0; i <10; i ++) {System.out.println ("valeur" + i + ":" + rf.readdouble ()); } rf.close (); }}Fichier mappé de mémoire
Les fichiers mappés de mémoire vous permettent de créer et de modifier des fichiers trop grands pour mettre en mémoire. Avec le fichier mappé de mémoire, vous pouvez penser que le fichier a été lu dans la mémoire et y accéder comme un très grand tableau. Cette solution peut considérablement simplifier le code de modification des fichiers.
FileChannel.map (Mode FileChannel.MapMode, position longue, taille longue) mappe la zone de fichier de ce canal directement dans la mémoire. Notez que vous devez indiquer d'où il est à partir de et quelle est la portée de la plage de la carte; Autrement dit, il peut également cartographier un petit fragment d'un grand fichier.
MaptedByteBuffer est une sous-classe de bytebuffer, il a donc toutes les méthodes de bytebuffer, mais une nouvelle force () est ajoutée pour forcer à actualiser le contenu du tampon sur le périphérique de stockage, le chargement () charge les données dans le périphérique de stockage dans la mémoire et isload () dans le lieu de mémoire si les données dans la mémoire sont synchronisées avec les paramètres de stockage. Ici, nous ne montrons que brièvement les méthodes put () et get (). De plus, vous pouvez également utiliser des méthodes telles que AsCharbuffer () pour obtenir la vue tamponnée des données de type de base correspondantes, qui peuvent facilement lire et écrire des données de type de base.
import java.io.randomaccessfile; Importer java.nio.mappytebuffer; Importer java.nio.channels.fileChannel; classe publique LargemAPPFiles {static int longueur = 0x8000000; // 128 Mo public static void main (String [] args) lève l'exception {// Afin d'ouvrir le fichier de manière lisible et écrivative, RandomAccessFile est utilisé ici pour créer le fichier. FileChannel fc = new randomaccessfile ("test.dat", "rw"). GetChannel (); // Notez que le canal de fichier lisible et écrit doit être basé sur le flux de fichiers lisible et écrit lui-même. MappedByteBuffer out = fc.map (filechannel.mapMode.read_write, 0, longueur); // Écrivez du contenu 128m pour (int i = 0; i <longueur; i ++) {out.put ((byte) 'x'); } System.out.println ("Écriture finie"); // Lire 6 octets du milieu du fichier pour (int i = longueur / 2; i <longueur / 2 + 6; i ++) {System.out.print ((char) out.get (i)); } fc.close (); }}Bien qu'il semble que FileOutputStream soit utilisé pour écrire le mappage, toutes les sorties dans le fichier de mappage doivent utiliser RandomAccessFile, mais si vous avez seulement besoin de lire FileInputStream, vous devez utiliser un fichier d'accès aléatoire lors de l'écriture de fichiers de mappage. Peut-être la raison de lire lors de l'écriture.
Le programme crée un fichier de 128 Mo. Si vous lisez la mémoire à la fois, cela peut provoquer un débordement de mémoire, mais l'accès ici semble être juste un instant, car seule une petite partie est en fait transférée dans la mémoire, et le reste est placé sur le fichier d'échange. De cette façon, vous pouvez facilement modifier les fichiers super-grands (jusqu'à 2 Go). Notez que Java appelle le «mécanisme de mappage de fichiers» du système d'exploitation pour améliorer les performances.
Application de la classe RandomAccessFile:
/ * * Fonction du programme: démontrez le fonctionnement de la classe RandomAccessFile et implémentez une opération de copie de fichiers. * / package com.lwj.demo; importer java.io. *; classe publique RandomAccessFileDemo {public static void main (String [] args) lève l'exception {RandomAccessFile file = new randomaccessfile ("file", "rw"); // Le suivant écrit des données sur le fichier file.writeInt (20); // il occupe 4 octets file.writedouble (8.236598); // il occupe 8 octets file.writeUtf ("il s'agit d'une chaîne UTF"); // Cette longueur est écrite dans les deux premiers octets du pointeur de fichier actuel. File.writeBoolean (true); // occupe 1 byte file.writeShort (395); // occupe 2 octets file.writelong (2325451l); // occupe 8 octets file.writeUtf ("une autre chaîne UTF"); file.writefloat (35.5f); // occupe 4 octets file.writechar ('a'); // occupe 2 octets file.seek (0); // définir la position du pointeur de fichier au début du fichier // Ce qui suit est de lire les données du fichier de fichier. Faites attention à l'emplacement du fichier pointeur System.out.println ("` `` `` `` `` `` `` `` -; System.out.println (file.readInt ()); System.out.println (file.readDouble ()); System.out.printLn (file.readutf ()); file.skipytes (3) / skipt Pointer par 3 octets, et dans ce cas, une valeur booléenne et une valeur courte sont sautées. System.out.println (file.readfloat ()); Numéro) Byte [] B = NOUVEAU BYTE [LEN]; RandomAccessFile Insertion Écrivez Exemple:
/ ** * * @param sauter combien d'octets à sauter pour insérer les données * @param str string pour insérer * @param chemin de fichier de nom de fichier * / public static void beiju (skip long, string str, string filename) {try {randomaccessfile raf = new randomaccessfile (filename, "rw"); if (skip <0 || skip> raf.length ()) {System.out.println ("Le nombre de saut d'octets sautés est invalide"); retour; } octet [] b = str.getBytes (); raf.setLength (raf.length () + b.length); for (long i = raf.length () - 1; i> b.length + skip - 1; i -) {raf.seek (i - b.length); octet temp = raf.readbyte (); raf.seek (i); raf.writebyte (temp); } raf.seek (skip); raf.write (b); raf.close (); } catch (exception e) {e.printStackTrace (); }}Utilisez RandomAccessFile pour réaliser un téléchargement multi-thread de fichiers, c'est-à-dire que lorsque plusieurs threads téléchargent un fichier, le fichier est divisé en plusieurs pièces et chaque pièce est téléchargée avec un thread différent. Voici un exemple de l'utilisation de la lecture multithyque lors de l'écriture de fichiers, où l'espace requis pour le fichier est pré-allocalisé, puis a repris dans l'espace alloué, puis écrit:
import java.io.filenotfoundException; Importer java.io.ioException; import java.io.randomaccessfile; / ** * Test en utilisant le multithreading pour les opérations de rédaction de fichiers * / Test de classe publique {public static void main (String [] args) lève une exception {// l'espace disque pré-allocalisé, un fichier d'une taille spécifiée sera créé sur le disque RandomAccessFile RAF = nouveau RandomAccessfile ("d: //abc.txt", "rw"); raf.setLength (1024 * 1024); // espace de fichier 1M pré-allocalisé raf.close (); // contenu de fichier à être écrit S1 = "First String"; String s2 = "deuxième chaîne"; String S3 = "Third String"; String S4 = "Quatrième chaîne"; String S5 = "Fifth String"; // Écrivez un fichier en même temps à l'aide de plusieurs threads nouveaux FileWriteThread (1024 * 1, s1.getBytes ()). Start (); // Écrivez des données à partir de 1024 octets du fichier nouveau filewriteThread (1024 * 2, s2.getBytes ()). Start (); // Écrivez des données à partir de 2048 octets du fichier nouveau FileWriteThread (1024 * 3, S3.GetBytes ()). Start (); // Écrivez des données à partir de 3072 octets du fichier nouveau filewriteThread (1024 * 4, s4.getBytes ()). Start (); // Écrivez des données à partir de 4096 octets du fichier nouveau filewriteThread (1024 * 5, s5.getBytes ()). Start (); // Écrivez des données à partir de 5120 octets du fichier} // Utilisez un thread pour écrire des données spécifiées à l'emplacement spécifié de la classe statique de fichier FileWriteThread étend Thread {private int skip; contenu octet privé []; public filewriteThread (int skip, byte [] contenu) {this.skip = skip; this.Content = contenu; } public void run () {randomaccessfile raf = null; essayez {raf = new randomaccessfile ("d: //abc.txt", "rw"); raf.seek (skip); raf.write (contenu); } catch (filenotFoundException e) {e.printStackTrace (); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); } enfin {try {raf.close (); } catch (exception e) {}}}}}}}L'explication détaillée de l'utilisation de Java RandomAccessfile ci-dessus est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.