![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
NIO
头发还长的程序员
这个作者很懒,什么都没留下…
展开
-
(十二)Java NIO与IO
一、简介当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。二、Java NIO和IO的主要区别下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NI...原创 2020-03-23 11:24:54 · 87 阅读 · 0 评论 -
(十一)Pipe
一、简介Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。这里是Pipe原理的图示:二、创建管道通过Pipe.open()方法打开管道。例如:Pipe pipe = Pipe.open();三、向管道写数据要向管道写数据,需要访问sink通道。...原创 2020-03-23 11:11:15 · 91 阅读 · 0 评论 -
(十)DatagramChannel
一、简介Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。二、打开 DatagramChannel下面是 DatagramChannel 的打开方式:DatagramChannel channel = DatagramChannel.open();chann...原创 2020-03-23 10:55:23 · 213 阅读 · 0 评论 -
(九)ServerSocketChannel
一、简介Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。这里有个例子:ServerSocketChannel serverSocketChannel = ServerSocketChannel.ope...原创 2020-03-23 10:44:40 · 231 阅读 · 0 评论 -
(八)SocketChannel
一、简介Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。二、打开 SocketChannel下面是SocketChannel的...原创 2020-03-23 10:39:50 · 213 阅读 · 0 评论 -
(七)FileChannel
一、简介Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。二、打开FileChannel在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或Rando...原创 2020-03-23 10:31:58 · 286 阅读 · 0 评论 -
(六)Selector
一、简介Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。二、为什么使用Selector?仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有通道。对于操作系统来说,线程之间...原创 2020-03-22 17:54:51 · 173 阅读 · 0 评论 -
(五)通道之间的数据传输
一、简介在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另一个channel。二、transferFrom()FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中).下面是一个简单的例子...原创 2020-03-22 16:02:01 · 681 阅读 · 0 评论 -
(四)Scatter/Gather
一、简介Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel中读取或者写入到Channel的操作。分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(gather)写入Channel是指在...原创 2020-03-22 15:31:48 · 408 阅读 · 0 评论 -
(三)Buffer
一、简介Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。二、Buffer的基本用法使用Buffer读写数据一般遵循以下四个步骤:1.写入数据到Buffer2.调...原创 2020-03-22 14:54:39 · 327 阅读 · 0 评论 -
(二)Channel
一、简介Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:二、Channel的实现这些是Java NIO中最重要的通道的实现...原创 2020-03-22 12:01:33 · 2834 阅读 · 0 评论 -
(一)Java NIO 概述
一、简介IO是同步阻塞,NIO是同步非阻塞。阻塞是指处于阻塞状态的时候,无法进行其他任务,只有等待当前任务完成的时候才能进行下一个任务,例如当serverSocket创建好之后。非阻塞的话是不管当前任务完成没有,直接将其返回,然后进行下一个任务。当实现一个同步IO的时候,使用线程池来完成同步操作,这时候线程之间需要来回切换(因为它是阻塞的)。所以如果用NIO的Selector实现同步非...原创 2020-03-22 10:36:47 · 94 阅读 · 0 评论