分类标签归档:Java-NIO

Java NIO Pipe管道


Java NIO Pipe管道

一个Java NIO的管道是两个线程间单向传输数据的连接。一个管道(Pipe)有一个source channel和一个sink channel(没想到合适的中文名)。我们把数据写到sink channel中,这些数据可以同过source channel再读取出来。

下面是一个管道的示意图:

/static/assets/blog/java/pipe-internals.png

创建管道(Creating a Pipe)

打开一个管道通过调用Pipe.open()工厂方法,如下:

Pipe pipe = Pipe.open();

向管道写入数据(Writing to a Pipe)

向管道写入数据需要访问他的sink channel:

Pip...

阅读全文...

Java NIO vs. IO


当学习Java的NIO和IO时,有个问题会跳入脑海当中:什么时候该用IO,什么时候用NIO?

下面的章节中笔者会试着分享一些线索,包括两者之间的区别,使用场景以及他们是如何影响代码设计的。

NIO和IO之间的主要差异(Mian Differences Between Java NIO and IO)

下面这个表格概括了NIO和IO的主要差异。我们会针对每个差异进行解释。

IO NIO
Stream oriented Buffer oriented
Blocking IO No blocking IO
Selectors

面向流和面向缓冲区比较(Stream O...

阅读全文...

Java NIO DatagramChannel数据报通道


一个Java NIO DatagramChannel死一个可以发送、接收UDP数据包的通道。由于UDP是面向无连接的网络协议,我们不可用像使用其他通道一样直接进行读写数据。正确的做法是发送、接收数据包。

打开一个DatagramChannel(Opening a DatagramChannel)

打开一个DatagramChannel你这么操作:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

上述示例中,我们打开了一个Datagra...

阅读全文...

Java NIO SocketChannel套接字通道


在Java NIO体系中,SocketChannel是用于TCP网络连接的套接字接口,相当于Java网络编程中的Socket套接字接口。创建SocketChannel主要有两种方式,如下:

  1. 打开一个SocketChannel并连接网络上的一台服务器。
  2. 当ServerSocketChannel接收到一个连接请求时,会创建一个SocketChannel。

建立一个SocketChannel连接

打开一个SocketChannel可以这样操作:

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect...

阅读全文...

Java NIO ServerSocketChannel服务端套接字通道


Java NIO ServerSocketChannel服务端套接字通道

在Java NIO中,ServerSocketChannel是用于监听TCP链接请求的通道,正如Java网络编程中的ServerSocket一样。

ServerSocketChannel实现类位于java.nio.channels包下面。 下面是一个示例程序:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bin(new InetSocketAddress(9999...

阅读全文...

Java NIO Selector选择器


Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。

为什么使用Selector(Why Use a Selector?)

用单线程处理多个channels的好处是我需要更少的线程来处理channel。实际上,你甚至可以用一个线程来处理所有的channels。从操作系统的角度来看,切换线程开销是比较昂贵的,并且每个线程都需要占用系统资源,因此暂用线程越少越好。

需要留意的是,现代操作系统和CPU在多任务处理上已经变得越来越好,所以多线程带来的影响也越来越小...

阅读全文...

Java NIO FileChannel文件通道


Java NIO中的FileChannel是用于连接文件的通道。通过文件通道可以读、写文件的数据。Java NIO的FileChannel是相对标准Java IO API的可选接口。

FileChannel不可以设置为非阻塞模式,他只能在阻塞模式下运行。

打开文件通道(Opening a FileChannel)

在使用FileChannel前必须打开通道,打开一个文件通道需要通过输入/输出流或者RandomAccessFile,下面是通过RandomAccessFile打开文件通道的案例:

RandomAccessFile aFile = new RandomAccessFile("d...

阅读全文...

Java NIO Scatter / Gather


Java NIO发布时内置了对scatter / gather的支持。scatter / gather是通过通道读写数据的两个概念。

Scattering read指的是从通道读取的操作能把数据写入多个buffer,也就是sctters代表了数据从一个channel到多个buffer的过程。

gathering write则正好相反,表示的是从多个buffer把数据写入到一个channel中。

Scatter/gather在有些场景下会非常有用,比如需要处理多份分开传输的数据。举例来说,假设一个消息包含了header和body,我们可能会把header和body保存在不同独立buffer...

阅读全文...

Java NIO Channel to Channel Transfers通道传输接口


在Java NIO中如果一个channel是FileChannel类型的,那么他可以直接把数据传输到另一个channel。逐个特性得益于FileChannel包含的transferTo和transferFrom两个方法。

transferFrom()

FileChannel.transferFrom方法把数据从通道源传输到FileChannel:

RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel      fromChannel = fromFile.getChannel...

阅读全文...

Java NIO Channel通道


Java NIO Channel通道和流非常相似,主要有以下几点区别:

  • 通道可以读也可以写,流一般来说是单向的(只能读或者写)。
  • 通道可以异步读写。
  • 通道总是基于缓冲区Buffer来读写。

正如上面提到的,我们可以从通道中读取数据,写入到buffer;也可以中buffer内读数据,写入到通道中。下面有个示意图:

overview-channels-buffers.png

Java NIO: Channels read data into Buffers, and Buffers write data into Channels

Channel的实现(Channel Implementations)

下面列出Java NIO中最重要的集中Ch...

阅读全文...