NIO学习笔记(1)--非阻塞I/O

本文介绍了阻塞I/O的概念,强调了同步/异步、阻塞/非阻塞的区别。Java NIO(非阻塞I/O)在1.4版本后引入,通过Buffer和Channel提升I/O效率,并利用Selector实现非阻塞操作。代码示例展示了BIO和NIO在文件读写及socket通讯上的差异,NIO的非阻塞特性避免了两端卡死的问题。
摘要由CSDN通过智能技术生成

一. 什么是阻塞?

      阻塞(Block)这个概念。当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。

     我自己是这样理解(同步/异步、阻塞/非阻塞)的:

    所谓同步就是当一个进程发起一个函数(任务)调用的时候,一直会到函数(任务)完成。进程继续往下执行。而异步这不会这样,异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件。等方式通知进程任务完成。

    而阻塞和非阻塞的概念相对明了多了。阻塞是当请求不能满足的时候就试进程挂起,非阻塞则是直接返回


二.NIO包

     java.nio包是Java在1.4之后增加的,用来提高I/O操作的效率。在nio包中主要包括以下几个类或接口:

     * Buffer:缓冲区,用来临时存放输入或输出数据。

     * Charset:用来把Unicode字符编码和其它字符编码互转。

     * Channel:数据传输通道,用来把Buffer中的数据写入到数据源,或者把数据源中的数据读入到Buffer。

     * Selector:用来支持异步I/O操作,也叫非阻塞I/O操作。


     nio包中主要通过下面两个方面来提高I/O操作效率:

     * 通过Buffer和Channel来提高I/O操作的速度。

     * 通过Selector来支持非阻塞I/O操作。


三. 代码示例(文件读写 & socket通讯)

     以下是 BIO,和NIO的 文件读写、socket通讯,大家可以对比下有什么不一样
     BIO:

public class FileIODemo {
	public static void main(String[] args) {
		//获取文件
		File fileRead = new File("fileIORead.txt");
		File fileWrite = new File("fileIOWrite.txt");
		
		//字节流
		try {
			FileInputStream input=new FileInputStream(fileRead);
			FileOutputStream out=new FileOutputStream(fileWrite);
			
			//缓冲数组
			byte[] buffer=new byte[10];
			int i=0;
			while(input.read(buffer)!=-1){
				System.out.println("i:"+i++);
				out.write(buffer);
			}
			input.close();
			out.close();
			
		} catch (FileNotFoundException e) {
			e.printSta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值