NIO(即New IO)中的Buffer和Channel

NIO(即New IO)概念:

JDK1.4版本开始,JDK提供了新的IO操作API, NIO提供多路(non-blocking) 非阻塞式的高伸缩性网络I/O,从而提高了效率,NIO主要有三大核心组件:Channel、Buffer和Selector(Select我们以后再说)

Buffer

1、Buffer是一个抽象类,Buffer类型变量对应的对象代表一块缓冲区,ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer类都是Buffer抽象类的子类,其中ByteBuffer最常用

2、ByteBuffer常用方法:

  • ①static ByteBuffer allocate(int capacity):分配一个新的字节缓冲区
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
	}
}

源码分析:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
源码比较多,我们就直接说机制:我们可以看到,最终抽象父类中有四个成员属性:mark、position、limit、capacity。实际上cap值最终赋值给capacity、为此缓存区容量大小,lim最终会赋值给limit、为当前缓冲区上界值。position为当前所在位置。mark为标志。

  • ②int capacity() :返回此缓冲区的容量,实际上直接将capacity成员属性值返回。
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			System.out.println(bytebuffer.capacity());
	}
}
/*输出结果:1024*/
  • ③ByteBuffer put(byte b):将字节类型数据写入当前位置的缓冲区,然后position+1,位置从0开始
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			byte a=3;
			bytebuffer.put(a);
	}
}
  • ④byte[] array() :将ByteBuffer类型的数据转为byte数组
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			byte a=3;
			bytebuffer.put(a);
			byte[] bbuf=bytebuffer.array();
	}
}
  • ⑤int position():返回缓冲区当前位置,实际上直接将position成员属性值返回。
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			System.out.println(bytebuffer.position());
			byte a=3;
			bytebuffer.put(a);
			System.out.println(bytebuffer.position());
	}
}
/*输出结果:0   1*/
  • ⑥Buffer flip() :翻转缓冲区,将当前position值赋值给limit,并将position置零;这个方法主要防止在最后一次输出时,如果缓存区并未装满,则将position值赋值给limit即为当前缓冲区内数据量,一般搭配hasRemaining方法使用。如果没有limit属性而直接使用capacity,则会输出冗余数据。
    如下源码:
    在这里插入图片描述
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			bytebuffer.position();
			byte a=3;
			bytebuffer.put(a);
			bytebuffer.position();
			bytebuffer. flip();
			bytebuffer.position();
	}
}
/*输出结果:0   1   0*/
  • ⑦byte get()读取缓冲区当前位置的字节,然后当前位置+1
/*应用*/
public class Test {
	public static void main(String[] args) {
			ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
			bytebuffer.position();
			byte a=3;
			bytebuffer.put(a);
			bytebuffer.position();
			bytebuffer. flip();
			bytebuffer.position();
			bytebuffer.get();
	}
}
  • ⑧boolean hasRemaining():在释放缓冲区时告诉您是否已经达到缓冲区的上界
    源码:
    在这里插入图片描述
/*应用*/
public class Test {
	public static void main(String[] args) {
		ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
		System.out.println(bytebuffer.position());
		byte a=3;
		bytebuffer.put(a);
		System.out.println(bytebuffer.position());
		System.out.println(bytebuffer.hasRemaining());
		bytebuffer. flip();
		bytebuffer.get();
		System.out.println(bytebuffer.position());
		System.out.println(bytebuffer.hasRemaining());
	}
}
/*输出结果:0   1   true   1   false*/
  • ⑨Buffer clear():将缓冲区重置为空状态。它并不改变缓冲区中的任何数据元素,而是仅仅将上界值初始化为容量的值,并把位置设回0。
    源码:
    在这里插入图片描述
/*应用*/
public class Test {
	public static void main(String[] args) {
		ByteBuffer bytebuffer=ByteBuffer.allocate(1024);
		bytebuffer.position();
		byte a=3;
		bytebuffer.put(a);
		bytebuffer.clear();
		System.out.println(bytebuffer.get());
		System.out.println(bytebuffer.position());
		System.out.println(bytebuffer.hasRemaining());
	}
}
/*输出结果:3   1   true*/

Channel

1、Channel是一个接口,该接口类型变量指向的对象代表一个数据传输通道,Channel对象是面向缓冲区的:数据总是从通道读取到缓冲区(Buffer类型对象),或从缓冲区(Buffer类型对象)写入到通道中

2、Channel接口主要实现类如下:

  • ①FileChannel:从文件中读写数据。
  • ②DatagramChannel:通过UDP读写网络中的数据。
  • ③SocketChannel:通过TCP读写网络中的数据。
  • ④ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样,对每一个新进来的连接都会创建一个SocketChannel。
public class Test {
	public static void main(String[] args) {
		try {
			FileInputStream fileInputStream=new FileInputStream("D:\\1.txt");
			FileChannel inChannel=fileInputStream.getChannel();
			
			FileOutputStream fileOutputStream=new FileOutputStream("D:\\2.txt");
			FileChannel ouChannel=fileOutputStream.getChannel();
			
			ByteBuffer byteBuffer= ByteBuffer.allocate(1024);
			while(inChannel.read(byteBuffer)!=-1) {
				byteBuffer.flip();
				ouChannel.write(byteBuffer);
				byteBuffer.clear();
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值