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

一. 什么是阻塞?

      阻塞(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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值