ITPub博客

首页 > 应用开发 > Java > Java NIO系列教程(二) Channel

Java NIO系列教程(二) Channel

Java 作者:喝水会长肉 时间:2021-12-03 13:39:25 0 删除 编辑

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

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

  • 通道可以异步地读写。

  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:


Channel的实现

这些是Java NIO中最重要的通道的实现:

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。

SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

基本的 Channel 示例

下面是一个使用FileChannel读取数据到Buffer中的示例:

RandomAccessFile aFile 
= 
new 
RandomAccessFile
(
"data/nio-data.txt"
, 
"rw"
)
;


FileChannel inChannel = aFile . getChannel ( ) ;

ByteBuffer buf = ByteBuffer . allocate ( 48 ) ;

int bytesRead = inChannel . read (buf ) ;

while (bytesRead != - 1 ) {

System .out . println ( "Read " + bytesRead ) ;

buf . flip ( ) ;
//java学习交流:737251827  进入可领取学习资源及对十年开发经验大佬提问,免费解答!
while (buf . hasRemaining ( ) ) {

 System .out . print ( (char ) buf . get ( ) ) ;

}

buf . clear ( ) ;

bytesRead = inChannel . read (buf ) ;

}

aFile . close ( ) ;

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010294/viewspace-2845618/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 模块化的乐趣
请登录后发表评论 登录
全部评论

注册时间:2021-11-19

  • 博文量
    199
  • 访问量
    86401