<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
java channel是什麼,讓我們一起了解一下?
Channel是通道的意思,表示IO源與目標打開的連接,類似於傳統的“流”,但是Channel不能直接訪問數據,需要和緩衝區buffer進行交互。
打個比喻:山西有煤,山東想要,於是乎建了一條鐵路連通到山東,這條鐵路就是這裏的"Channel",那麼煤通過什麼運過來呢?鐵路建好了,就差火車了,因此這裏的火車就像是緩衝區,火車把山西的煤運到山東來,把我們這裏的錢運過去,這樣雙向傳輸就愉快的完成了。Channel類似於傳統的“流”,只不過Channel不能直接訪問數據,Channel只能與buffer交互。而且流是單向的,分為輸入流和輸出流, 但是通道是雙向的,通過緩衝區buffer兩邊都可達,Channel表示IO源與目標打開的連接。
獲取通道的方式有哪些?
1、通過getChannel()方法獲取。
前提是該類支持該方法。支持該類的方法有:
FileInputStream/FileOutputStream,RandomAccessFile,Socket,ServerSocket ,DatagramSocket
2、通過靜態方法open()。
3、通過jdk1.7中Files的newByteChannel()方法。
java channel是如何實現的?
我們以AbstractChannel為例,通過提供一些公共API進行實現,比如localAddress()和 remoteAddress()方法,實現源碼如下:
public SocketAddress localAddress() { SocketAddress localAddress = this.localAddress; if (localAddress == null) { try { this.localAddress = localAddress = unsafe().localAddress(); } catch (Throwable t) { // Sometimes fails on a closed socket in Windows. return null; } } return localAddress;}