Maison  >  Article  >  Java  >  Canal de fichiers de JAVA-6NIO

Canal de fichiers de JAVA-6NIO

巴扎黑
巴扎黑original
2017-06-26 09:57:401324parcourir

FileChannel en Java NIO est un canal connecté à un fichier. Les fichiers peuvent être lus et écrits via des canaux de fichiers.

FileChannel ne peut pas être réglé en mode non bloquant, il s'exécute toujours en mode bloquant.

Ouvrir FileChannel

Avant d'utiliser FileChannel, vous devez l'ouvrir. Cependant, nous ne pouvons pas ouvrir directement un FileChannel. Nous devons obtenir une instance FileChannel en utilisant un InputStream, OutputStream ou RandomAccessFile.

Lire les données de FileChannel

Appelez l'une des multiples méthodes read() pour lire les données de FileChannel.

Tout d'abord, allouez un tampon. Les données lues depuis FileChannel seront lues dans Buffer.

Ensuite, appelez la méthode FileChannel.read(). Cette méthode lit les données de FileChannel dans Buffer. La valeur int renvoyée par la méthode read() indique combien d'octets ont été lus dans le Buffer. Si -1 est renvoyé, cela signifie que la fin du fichier a été atteinte.

Écrire des données dans FileChannel

Utilisez la méthode FileChannel.write() pour écrire des données dans FileChannel Le paramètre de cette méthode est un Buffer.

Notez que FileChannel.write() est appelé dans une boucle while. Comme il n'y a aucune garantie du nombre d'octets que la méthode write() peut écrire dans le FileChannel à la fois, la méthode write() doit être appelée à plusieurs reprises jusqu'à ce qu'il n'y ait plus d'octets dans le Buffer qui n'aient pas été écrits dans le canal.

Fermer FileChannel

FileChannel doit être fermé après utilisation. Par exemple :

Méthode de position de FileChannel

Parfois, il peut être nécessaire de lire/écrire des données à une position spécifique de FileChannel. Vous pouvez obtenir la position actuelle de FileChannel en appelant la méthode position().

Vous pouvez également définir la position actuelle de FileChannel en appelant la méthode position(long pos).

Si vous définissez la position après la fin du fichier et que vous essayez ensuite de lire les données du canal de fichier, la méthode de lecture renverra -1 - l'indicateur de fin de fichier.

Si vous définissez la position après la fin du fichier puis écrivez des données sur le canal, le fichier sera étendu à la position actuelle et les données seront écrites. Cela peut entraîner des « trous de fichiers », des écarts entre les données écrites dans les fichiers physiques du disque.

Méthode size de FileChannel

La méthode size() d'une instance FileChannel renverra la taille du fichier associé à l'instance. Par exemple :

La méthode troncate de FileChannel

peut utiliser la méthode FileChannel.truncate() pour intercepter un fichier. Lors de l'interception d'un fichier, la partie après la longueur spécifiée du fichier sera supprimée. Par exemple :

Cet exemple intercepte les 1024 premiers octets du fichier.

La méthode force de FileChannel

La méthode FileChannel.force() force les données du canal qui n'ont pas encore été écrites sur le disque à être écrites sur le disque. Pour des raisons de performances, le système d'exploitation met les données en cache dans la mémoire. Il n'y a donc aucune garantie que les données écrites sur FileChannel seront immédiatement écrites sur le disque. Pour garantir cela, la méthode force() doit être appelée.

La méthode force() a un paramètre booléen, indiquant s'il faut écrire les métadonnées du fichier (informations d'autorisation, etc.) sur le disque en même temps.

/** * file channel     */@Testpublic void text1() throws IOException {//从buffer读RandomAccessFile raf = new RandomAccessFile(new File("./test.txt"),"rw");
        FileChannel channel = raf.getChannel();             //获取通道channel.position(channel.size());                   //设置文件末尾位置,作为写入初始位置;不带参获取指针位置ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区byteBuffer.put("456".getBytes());
        byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断            channel.write(byteBuffer);
        }
        channel.truncate(2);                                //截取文件channel.force(true);                      //强行写        raf.close();//向buffer写raf = new RandomAccessFile(new File("./test.txt"),"rw");
        channel = raf.getChannel();
        byteBuffer = ByteBuffer.allocate(1024);int read;while ((read = channel.read(byteBuffer))!=-1) {
            byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断System.err.print((char)byteBuffer.get());       //输出            }
            byteBuffer.clear();                                 //清除        }
    }

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