JAVA-2NIO之Channel
生活随笔
收集整理的這篇文章主要介紹了
JAVA-2NIO之Channel
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注意:轉載自并發編程網 – 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的更多細節
轉載于:https://www.cnblogs.com/zhangxinly/p/6958570.html
總結
以上是生活随笔為你收集整理的JAVA-2NIO之Channel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s5_day2作业
- 下一篇: 【Oracle】Exadata虚拟机配置