![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java NIO
文章平均质量分 75
nukix
I want to be more stronger ...
展开
-
【转载】Java NIO 系列教程
Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。转载 2016-10-12 01:44:04 · 464 阅读 · 1 评论 -
【转载】Java NIO系列教程(十三)Java NIO与IO
Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。你所知道的是,该缓冲区包含一些字节,这使得处理有点困难。转载 2022-11-16 02:53:37 · 153 阅读 · 0 评论 -
【转载】Java NIO系列教程(十二)Pipe
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。read() 方法返回的 int 值会告诉我们多少字节被读进了缓冲区。通过Pipe.open()方法打开管道。要向管道写数据,需要访问sink通道。转载 2022-11-16 02:31:10 · 164 阅读 · 0 评论 -
【转载】Java NIO系列教程(十一)Java NIO DatagramChannel
可以将DatagramChannel“连接”到网络中的特定地址的。由于UDP是无连接的,连接到特定地址并不会像TCP通道那样创建一个真正的连接。也不会通知你发出的数据包是否已收到,因为UDP在数据传送方面没有任何保证。Java NIO中的DatagramChannel是一个能收发UDP包的通道。当连接后,也可以使用read()和write()方法,就像在用传统的通道一样。转载 2022-11-16 02:28:05 · 371 阅读 · 0 评论 -
【转载】Java NIO系列教程(十)非阻塞式服务器
即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel,Buffer等组件),但是想要设计一个非阻塞的服务器仍然是一件很困难的事。非阻塞式服务器相较于阻塞式来说要多上许多挑战。本文将会讨论非阻塞式服务器的主要几个难题,并针对这些难题给出一些可能的解决方案。查找关于非阻塞式服务器设计方面的资料实在不太容易,所以本文提供的解决方案都是基于本人工作和想法上的。如果各位有其他的替代方案或者更好的想法,我会很乐意听取这些方案和想法!转载 2022-11-16 02:20:31 · 272 阅读 · 0 评论 -
【转载】Java NIO系列教程(九) ServerSocketChannel
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的 ServerSocket 一样。当 accept()方法返回的时候,它返回一个包含新进来的连接的 SocketChannel。在非阻塞模式下,accept() 方法会立刻返回,如果还没有新进来的连接,返回的将是 null。转载 2022-11-16 01:27:33 · 130 阅读 · 0 评论 -
【转载】Java NIO系列教程(八) SocketChannel
如果 SocketChannel 在非阻塞模式下,此时调用 connect(),该方法可能在连接建立之前就返回了。可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用 connect(), read() 和 write() 了。写数据到 SocketChannel 用的是 SocketChannel.write() 方法,该方法以一个 Buffer 作为参数。非阻塞模式下,write()方法在尚未写出任何内容时可能就返回了。转载 2022-11-16 01:22:47 · 450 阅读 · 0 评论 -
【转载】Java NIO系列教程(七) FileChannel
因为无法保证 write() 方法一次能向 FileChannel 写入多少字节,因此需要重复调用 write() 方法,直到 Buffer 中已经没有尚未写入通道的字节。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。如果将位置设置在文件结束符之后,然后向通道中写数据,文件将撑大到当前位置并写入数据。使用FileChannel.write()方法向FileChannel写数据,该方法的参数是一个Buffer。转载 2022-11-16 01:20:19 · 443 阅读 · 0 评论 -
【转载】Java NIO系列教程(六) Selector
如果调用select()方法,因为有一个通道变成就绪状态,返回了1,若再次调用select()方法,如果另一个通道就绪了,它会再次返回1。如果对第一个就绪的channel没有做任何操作,现在就有两个就绪的通道,但在每次select()方法调用之间,只有一个通道就绪了。事实上,可以只用一个线程处理所有的通道。这里有一个完整的示例,打开一个Selector,注册一个通道注册到这个Selector上(通道的初始化过程略去),然后持续监控这个Selector的四种事件(接受,连接,读,写)是否就绪。转载 2022-11-16 01:14:43 · 161 阅读 · 0 评论 -
【转载】Java NIO系列教程(五) 通道之间的数据传输
FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。如果源通道的剩余空间小于 count 个字节,则所传输的字节数要小于请求的字节数。在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。是不是发现这个例子和前面那个例子特别相似?转载 2022-11-16 01:00:44 · 152 阅读 · 0 评论 -
【转载】Java NIO系列教程(四) Scatter/Gather
scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。转载 2022-11-15 23:59:26 · 103 阅读 · 0 评论 -
【转载】Java NIO系列教程(三) Buffer
初始的 position 值为0.当一个 byte、long 等数据写到 Buffer 后, position 会向前移动到下一个可插入数据的 Buffer 单元。作为一个内存块,Buffer 有一个固定的大小值,也叫“capacity”.你只能往里写 capacity 个 byte 、long,char等类型。当将 Buffer 从写模式切换到读模式,position 会被重置为0. 当从 Buffer 的 position 处读取数据时,position 向前移动到下一个可读的位置。转载 2022-11-15 23:54:23 · 120 阅读 · 0 评论 -
【转载】Java NIO系列教程(二) Channel
注意 buf.flip() 的调用,首先读取数据到 Buffer,然后反转 Buffer,接着再从 Buffer 中读取数据。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。DatagramChannel 能通过 UDP 读写网络中的数据。SocketChannel 能通过 TCP 读写网络中的数据。转载 2022-11-15 23:48:03 · 93 阅读 · 0 评论 -
【转载】Java NIO系列教程(一) Java NIO 概述
虽然 Java NIO 中除此之外还有很多类和组件,但在我看来, Channel,Buffer 和 Selector 构成了核心的 API。其它组件,如 Pipe 和 FileLock,只不过是与三个核心组件共同使用的工具类。其它组件会在单独的章节中讲到。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用 Selector 就会很方便。与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。转载 2022-11-15 23:41:22 · 128 阅读 · 0 评论