Java nio(一)

jdk1.4提供了java.nio包,为从根本上改善I/O的性能提供了可能,但是nio要比以前的I/O要复杂,提供了更底层的操作和更细的api。学起来并不是那么快就上手,有专门一本书 
介绍nio的。我希望通过总结更好的梳理整个nio框架各个类之间的关系,从而能够灵活的使用nio包。 
nio通常需要涉及到三个对象: 
1、数据源:从文件中获得的FileInputStream/FileOutputStream、从socket中获得的输入输出流等 
2、缓冲区对象(buffer):nio定义了一系列buffer对象,最基本的是ByteBuffer,其他还有各种基本数据类型除了boolean类型外,所对应的buffer类型。使用这些buffer一般的过程是:从数据源中读到ByteBuffer中,然后使用ByteBuffer.asXxxBuffer()转换成特定的基本类型,然后对这个基本类型的buffer进行操作;把基本类型转换成ByteBuffer类型,然后写入数据源中。 
3、通道对象(channel):他提供了对数据源的一个连接,可以从文件中获得FileChannel,从Socket中获得SocketChannel,它是一个中介。提供了数据源与缓冲区之间的读写操作。 
我们可以同过一句话来解释他们三者之间的关系: 
channel对象提供了数据源与缓冲区之间的读写操作,是数据源与缓冲区的一个桥梁,通过这个桥梁,数据在两者之间流动。 
首先我们看看这个中介Channel类的整个结构: 
Java代码   收藏代码
  1. Channel < Closable  
  2. WritableByteChannel < Channel  
  3. InterruptibleChannel < Channel  
  4. ReadableByteChannel < Channel  
  5. GetherByteChannel < WritableByteChannel   
  6. ByteChannel < WritableByteChannel,ReadableByteChannel   
  7. ScatteringByteChannel < ReadableByteChannel   


Channel接口声明了两个方法: 
close(),用来关闭通道 
isOpen(),用于测试通道是否打开 
其他的通道: 
ByteChannel只是简单的合并了WritableByteChannel和ReadableChannel的,ScatteringByteChannel接口扩展了ReadableChannel接口,添加了一个读取并将数据 
分布在不同缓冲区的方法,而GatheringByteChannel接口在WritableByteChannel的基础上添加了将多个独立的缓冲区写入驱动器中的方法。 
Java代码   收藏代码
  1. Closeable:  
  2. void close()//关闭源或目的地,并释放资源  
  3. Channel:  
  4. void close()//关闭通道  
  5. void boolean isOpen()//判断通道是否打开  
  6. ReadableByteChannel:  
  7. int read(ByteBuffer input)  
  8. //将字节从通道读入input缓冲区中,返回读取的字节数,到达流结尾时,返回-1  
  9. WritableByteChannel:  
  10. int write(ByteBuffer output)  
  11. //将字节从实参output缓冲区写入通道,返回写的字节数  
  12. ByteChannel 仅仅继承了ReadableByteChannel和WritableByteChannel的方法  
  13. ScatteringByteChannel:  
  14. int read(ByteBuffer[] inputs)  
  15. //将字节从通道读入inputs缓冲区数组中,返回读取的字节,到达流末尾是,返回-1  
  16. int read(ByteBuffer[] inputs,int offset,int length)  
  17. //将字节从通道读inputs[offset]---inputs[offeset+length-1]缓冲区中  
  18. GatherByteChannel:  
  19. int write(ByteBuffer[] outputs);  
  20. //把outputs缓存区数组写入通道中  
  21. int write(ByteBuffer[] outputs,int offset,int length);  
  22. 把从outputs[offset]-->outputs[offset+length-1]缓冲区写入通道中  

例子:(我们忽略了各种Exception) 
Java代码   收藏代码
  1. File file = new File("C:\\test.txt");  
  2. FileOutputStream fos = new FileOutputStream(file);  
  3. FileChannel outputChannel = fos.getChannel();  
  4. String str = "Hello,just a test";  
  5. ByteBuffer bb = ByteBuffer.wrap(str.getBytes());  
  6. outputChannel.write(bb);  

先总结到这,下次总结各种Buffer及其操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值