首頁 > Java > java教程 > JAVA之Channel詳解

JAVA之Channel詳解

怪我咯
發布: 2017-06-25 10:14:05
原創
2493 人瀏覽過

注意:轉載自並發程式設計網– ifeve.com本文連結位址: Java NIO系列教學(二) Channel

Channel

Java NIO的通道類似流,但又有些不同:

  • 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。

  • 通道可以非同步地讀寫。

  • 通道中的資料總是要先讀到一個Buffer,或是總是要從一個Buffer中寫入。

如上所說,從通道讀取資料到緩衝區,從緩衝區寫入資料到通道。如下圖所示:

 

一、Channel的實作

這些是Java NIO中最重要的通道的實作:

  • FileChannel

  • DatagramChannel

  • #SocketChannel

# ServerSocketChannel

######FileChannel 從文件中讀取與寫入資料。 ######DatagramChannel 能透過UDP讀寫網路中的資料。 ######SocketChannel 能透過TCP讀寫網路中的資料。 ######ServerSocketChannel可以監聽新進來的TCP連接,像Web伺服器。每一個新進來的連線都會建立一個SocketChannel。 ######二、基本的Channel 範例######下面是使用FileChannel讀取資料到Buffer中的範例:###############
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();
        }
    }
}
登入後複製
## #############注意buf.flip() 的調用,先讀取資料到Buffer,然後反轉Buffer,接著再從Buffer中讀取資料。下一節會深入解說Buffer的更多細節###

以上是JAVA之Channel詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板