Java NIO 系列—Java NIO 与 IO

Nio 是java New IO的简称,在jdk1.4里提供的新api。Sun 官方标榜的特性如下:
1. 为所有的原始类型提供(Buffer)缓存支持。
2. 字符集编码解码解决方案
3. channel : 一个新的原始I/O 抽象。
4. 支持锁和内存映射文件的文件访问接口。
5. 提供多路(non-bloking)非阻塞式的高伸缩性网络I/O。
NIO创建目的是为了让java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO 将最耗时的I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
在了解两者区别之前,先了解I/O的概念。
I : 就是从硬盘到内存
O:就是从内存到硬盘

阻塞与非阻塞I/O

第一种方式:从硬盘读取数据,然后程序一直等,数据读完后,继续操作,这种方式也叫阻塞IO。第二种方式:从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程勋(对硬件来说中断,对程序来说叫回调)然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

流与块的比较

Java NIO 和IO之间最大的区别是,IO是面向流的,NIO是面向缓冲区的。面向流意味着系统一次一个字节地处理数据。直到读取所有的字节,没有被缓存在任何地方。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。面向块的I/O是指每一个操作到在一步中产生或者消费一个数据块。

选择器

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后选择一个单独的选择器来选择“通道”:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

实例演示:

public class BufferedReaderDemo {
	
	public static void main(String[] args) throws IOException {
		String line = null; 
		try {
			FileReader in = new FileReader("C://Users//Tony//Desktop//文件流.txt");
			BufferedReader byReader = new BufferedReader(in);
			//一次读一行,读入null时文件结束
			while ((line = byReader.readLine())!=null) {
				System.out.println(line);
			}
			byReader.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

输出结果:
Name: Anna
Age: 25
Email: anna@mailserver.com
Phone: 1234567890
readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号

public class FileChannelDemo {

	public static void fileChannelDemo() throws IOException{
		//定义缓冲区对象
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		// 通过文件输入流获得文件通道对象(读取操作),获取输入输出通道
		FileChannel inFc = new FileInputStream("C://Users//Tony//Desktop//文件流.txt").getChannel();  
		//追加写入文件
		FileChannel outFcChannel = new FileOutputStream("C://Users//Tony//Desktop//文件流.txt",true).getChannel();  //
		//读取数据,clear()用来初始化缓存空间,使它可以接受读入的数据  
		buffer.clear();
		int len = inFc.read(buffer); // 从输入通道中将数据读到缓冲区  
		System.out.println(new String (buffer.array(),0,len));
		
		//写数据
		ByteBuffer buffer2 = ByteBuffer.wrap("oh my god!".getBytes());
		outFcChannel.write(buffer2);
	}
	
	public static void main(String[] args) throws IOException {
		fileChannelDemo();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值