Maison > Java > javaDidacticiel > Explication détaillée de Channel en JAVA

Explication détaillée de Channel en JAVA

怪我咯
Libérer: 2017-06-25 10:14:05
original
2463 Les gens l'ont consulté

Remarque : réimprimé de Concurrent Programming Network – ifeve.comAdresse du lien de cet article :Tutoriel Java NIO Series (2) Canal

Canal

Le canal de Java NIO est similaire à Stream, mais il existe quelques différences :

  • peut à la fois lire les données du canal et écrire des données sur le canal. Mais les flux de lecture et d’écriture sont généralement à sens unique.

  • Les chaînes peuvent être lues et écrites de manière asynchrone.

  • Les données du canal doivent d'abord être lues à partir d'un Buffer, ou toujours écrites à partir d'un Buffer.

Comme mentionné ci-dessus, les données sont lues du canal vers le tampon et les données sont écrites du tampon vers le canal. Comme le montre la figure ci-dessous :

1 Implémentation du canal

Ce sont les implémentations des canaux les plus importants en Java. NIO :

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel lit et écrit les données des fichiers.

DatagramChannel peut lire et écrire des données sur le réseau via UDP.

SocketChannel peut lire et écrire des données sur le réseau via TCP.

ServerSocketChannel peut surveiller les connexions TCP entrantes, tout comme un serveur Web. Un SocketChannel est créé pour chaque nouvelle connexion entrante.

2. Exemple de canal de base

Ce qui suit est un exemple d'utilisation de FileChannel pour lire des données dans un tampon :

public class Channel1 {public static void main(String[] args) {try {
            RandomAccessFile raf = new RandomAccessFile("./.gitignore","rw");
            FileChannel channel = raf.getChannel();     //获取通道ByteBuffer bf = ByteBuffer.allocate(50);    //通过静态allocate方法创建一个缓冲区,容量为50byte[] bytes = new byte[]{};
            bytes = "123".getBytes();
            bf = ByteBuffer.wrap(bytes);                //通过静态wrap方法,byte数组生成缓冲区,缓冲区中保留了原数据while(bf.hasRemaining()){
                System.out.print((char) bf.get());
            }int bytesRead ;while ((bytesRead = channel.read(bf)) != -1) {      //将通道中的数据写入缓冲区,并判断通道中的数据是否到末尾System.out.println("Read " + bytesRead);bf.flip();                                      //反转缓冲区 实际上就是将position置为0 后续buffer详细介绍while(bf.hasRemaining()){                       //判断缓冲区中是否还有值System.out.print((char) bf.get());          //输出缓冲区中的值                }
                bf.clear();                                     //清理缓冲区            }
            raf.close();                                        //关闭RandomAccessFile} catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Copier après la connexion

Faites attention à l'appel de buf.flip(), lisez d'abord les données dans le Buffer, puis inversez le Buffer, puis lisez les données du Buffer. La section suivante expliquera plus de détails sur Buffer

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal