NIO和IO的区别
IO是面向的流的编程,是阻塞的
NIO是面向缓存区的编程,是非阻塞的,通道(channel)负责连接IO的两端,缓冲器(buffer)负责存储数据
缓冲区
缓存区的实质就是数组,不同的类型的数组,存储不同类型的数据(boolean 类型除外)
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
通过allocate(缓冲区大小)分配缓冲区
存取数据
put() 将数据存入缓冲区
get() 获取缓冲区的数据
缓冲区中的四个核心概念
capacity
:容量,表示缓冲区中的最大的存储数据的容量。一旦声明不能改变
limit
:限制,当前缓冲区实际的数据量(limit后得数据不能被读写)
position
:位置,表当前缓冲正在操作数据的位置
mark
:标记,记录当前position的位置,可以通过reset() 恢复mark记录的position
关系:0
<= mark
<= position
<= limit
<= capacity
直接缓存区和非直接缓存区的区别
- 非直接缓存区:通过allocate() 方法分配缓冲区,将缓存区建立在JVM的内存中
- 直接缓冲区:通过allocateDirect() 方法分配直接缓冲区 将缓存区直接开辟在物理内存中
缓冲区的操作
1 | // 获取非直接缓存区 |
通道
通道(channel):用于源节点和目标节点的链接,Java NIO 负责缓冲区中数据的传输。Channel本身不存储数据,需要配合缓冲区进行传输数据
通道在java.nio.channels.Channel
接口
FileChannel
(本地文件)
SocketChannel
(网络TCP)
ServerSocketChannel
(网络TCP)
DatagramChannel
(UDP数据报)
获取通道
通过getChannel方法获取,以下类可以获取
本地IO:
FileInputStream
/FileOutputStream
/RandomAccessFile
网络IO:
Socket
/ServerSocket
/DatagramSocket
JDK1.7 在NIO.2 针对各通道提供的静态方法open()
JDK1.7 在NIO.2 的Files工具类中的newByteChannel()
1 | FileInputStream fis = null; |
1 | //用Open方式获取通道 |
通道之间的数据传输
transferFrom() transferTo()
1 | //用Open方式获取通道 |
分散(Scatter)与聚集(Gather)
分散读取(Scattering Reads) 将通道中的数据分散到多个缓冲区
聚集写入(Gathering Writes) 将多个缓冲区中的数据聚集到通道中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20RandomAccessFile raf = new RandomAccessFile("1.txt","rw");
FileChannel channel1 = raf.getChannel();
ByteBuffer buf1 = ByteBuffer.allocate(500);
ByteBuffer buf2 = ByteBuffer.allocate(500);
ByteBuffer[] byteBuffers = {buf1,buf2};
//分散读取
channel1.read(byteBuffers);
for(ByteBuffer buf : byteBuffers)
{
buf.flip();
}
/** System.out.println(new String(byteBuffers[0].array(),0,byteBuffers[0].limit()));
System.out.println("--------------------------------------------------------");
System.out.println(new String(byteBuffers[1].array(),0,byteBuffers[0].limit()));*/
//聚集写入
RandomAccessFile raf2 = new RandomAccessFile("2.txt","rw");
FileChannel channel2 = raf2.getChannel();
channel2.write(byteBuffers);
编码与解码
1 | Charset cset = Charset.forName("GBK"); |