JDK1.4版本开始,JDK提供了新的IO操作API, NIO提供多路(non-blocking) 非阻塞式的高伸缩性网络I/O,从而提高了效率,NIO主要有三大核心组件:Channel、Buffer和Selector,这里重点学习前两个。
一、Buffer:
Buffer是一个抽象类,Buffer类型变量对应的对象代表一块缓冲区,ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer类都是Buffer抽象类的子类,其中ByteBuffer最常用。
ByteBuffer常用方法:
1.static ByteBuffer allocate(int capacity):分配一个新的字节缓冲区。
2.int capacity() :返回此缓冲区的容量。
3.ByteBuffer put(byte b):将字节类型数据写入当前位置的缓冲区,然后当前位置+1,位置从0开始。
4.byte[] array() :将ByteBuffer类型的数据转为byte数组。
5.int position():返回缓冲区当前位置。
6.Buffer flip() ):翻转缓冲区,将position置零。
7.boolean hasRemaining():判断缓冲区是否含有数据 。
8.byte get():读取缓冲区当前位置的字节,然后当前位置+1。
9.Buffer clear():清除缓冲区,位置归零。
ByteBuffer byteBuffer =ByteBuffer.allocate(1024);//开辟一个字节为1024的内存空间
int a = byteBuffer.capacity();//
System.out.println(a);
System.out.println(byteBuffer.position());
byte c =4;
byteBuffer.put(c);
byteBuffer.clear();//清除内存空间位置归0.
byte b = 3;
byteBuffer.put(b);
byteBuffer.flip();
System.out.println(byteBuffer.position());//最后这三行代码是验证get方法后,位置确实增加了1.
System.out.println(byteBuffer.get());//get可以设置具体位置。
System.out.println(byteBuffer.position());
输出结果如下:分析注释
一、Channel:
Channel是一个接口,该接口类型变量指向的对象代表一个数据传输通道,Channel对象是面向缓冲区的:数据总是从通道读取到缓冲区(Buffer类型对象),或从缓冲区(Buffer类型对象)写入到通道中。
Channel接口主要实现类如下:
1.FileChannel:从文件中读写数据。
2.DatagramChannel:通过UDP读写网络中的数据。
3.SocketChannel:通过TCP读写网络中的数据。
4.ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样,对每一个新进来的连接都会创建一个SocketChannel。
关于上述4种方法,我暂时先详细将第一种方法的FileChannel的例子。放在这里:
try {
FileInputStream fileInputStream =new FileInputStream("C:\\aaa\\bbb\\111.jpg");
FileChannel inputChannel= fileInputStream.getChannel();
FileOutputStream fileOutputStream = new FileOutputStream("C:\\aaa\\bbb\\222.jpg");
FileChannel outputchannel = fileOutputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
while(inputChannel.read(byteBuffer)!=-1) {
byteBuffer.flip();
outputchannel.write(byteBuffer);
byteBuffer.clear();
}
} catch (Exception e) {
e.printStackTrace();
}