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

Explication détaillée de Channel en JAVA

怪我咯
怪我咯original
2017-06-25 10:14:052382parcourir

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();
        }
    }
}

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!

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