Java 新IO技术(NIO) JDK1.4

在JDK1.4以前,I/O输入输出处理,我们把它称为旧I/O处理,在JDK1.4开始,java提供了一系列改进的输入/输出新特性,这些功能被称为新I/O(NEW I/O),新添了许多用于处理输入/输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类以NIO为基础进行了改写,新添了满足新I/O的功能。


Java NIO和IO的主要区别

IO NIO
面向流
面向缓冲
阻塞IO 
 非阻塞IO
选择器

一、面向流与面向缓冲

        Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。

        Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

二、阻塞与非阻塞

        Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

        Java NIO的非阻塞模式,如使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。一个单独的线程可以管理多个输入和输出通道(channel)。

三、选择器(Selectors)

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



面向缓冲(Buffer)

在整个Java的心I/O中,所以操作都是以缓冲区进行的,使操作的性能大大提高。

在Buffer中存在一系列的状态变量,这状态变量随着写入或读取都可能会被概念,在缓冲区开元使用是三个值表示缓冲区的状态。

  • position:表示下个缓冲区读取或写入的操作指针,没向缓冲区中华写入数据的时候 此指针就会改变,指针永远放在写入的最后一个元素之后。即:如果写入了4个位置的数据,则posotion会指向第5个位置。
  • Limit:表示还有多少数据可以存储或读取,position<=limit
  • capacity:表示缓冲区的最大容量,limit<=capacity,此值在分配缓冲区时被设置。一般不改变。
示例代码(以IntBuffer为例)

1、通过
IntBuffer.allocate(int capacity),<strong style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">创建IntBuffer缓冲区</strong>
import java.nio.IntBuffer ;
public class IntBufferDemo01{
	public static void main(String args[]){
		IntBuffer buf = IntBuffer.allocate(10) ;	// 准备出10个大小的缓冲区
		System.out.print("1、写入数据之前的position、limit和capacity:") ;
		System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ;
		int temp[] = {5,7,9} ;// 定义一个int数组
		buf.put(3) ;	// 设置一个数据
		buf.put(temp) ;	// 此时已经存放了四个记录
		System.out.print("2、写入数据之后的position、limit和capacity:") ;
		System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ;

		buf.flip() ;	//向缓冲去写入数据后,在读取缓冲区写入的数据之前,需要重设缓冲区
		// postion = 0 ,limit = 原本position
		System.out.print("3、准备输出数据时的position、limit和capacity:") ;
		System.ou
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值