Heim  >  Artikel  >  Java  >  Detaillierte Erklärung des Kanals in JAVA

Detaillierte Erklärung des Kanals in JAVA

怪我咯
怪我咯Original
2017-06-25 10:14:052430Durchsuche

Hinweis: Nachdruck von Concurrent Programming Network – ifeve.comLinkadresse dieses Artikels:Java NIO Series Tutorial (2) Kanal

Kanal

Der Kanal von Java NIO ähnelt Stream, es gibt jedoch einige Unterschiede:

  • kann sowohl Daten vom Kanal lesen als auch Daten in den Kanal schreiben. Aber Lese- und Schreibströme sind normalerweise einseitig.

  • Kanäle können asynchron gelesen und geschrieben werden.

  • Die Daten im Kanal müssen zuerst aus einem Puffer gelesen oder immer aus einem Puffer geschrieben werden.

Wie oben erwähnt, werden Daten vom Kanal in den Puffer gelesen und Daten vom Puffer in den Kanal geschrieben. Wie in der folgenden Abbildung dargestellt:

1 Implementierung des Kanals

Dies sind die Implementierungen der wichtigsten Kanäle in Java NIO:

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel liest und schreibt Daten aus Dateien.

DatagramChannel kann Daten im Netzwerk über UDP lesen und schreiben.

SocketChannel kann über TCP Daten im Netzwerk lesen und schreiben.

ServerSocketChannel kann neue eingehende TCP-Verbindungen überwachen, genau wie ein Webserver. Für jede neue eingehende Verbindung wird ein SocketChannel erstellt.

2. Einfaches Kanalbeispiel

Das Folgende ist ein Beispiel für die Verwendung von FileChannel zum Einlesen von Daten in einen Puffer:

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

Achten Sie auf den Aufruf von buf.flip (), lesen Sie zuerst die Daten in den Puffer, kehren Sie dann den Puffer um und lesen Sie dann die Daten aus dem Puffer. Im nächsten Abschnitt werden weitere Details zu Buffer erläutert

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Kanals in JAVA. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn