三个月没写博客了,主要也不知道写什么,光顾着向GitHub传题目了。理了下思路,并结合了《Thinking in Java》和API文档,分享了下自己对NIO的理解,当然这只是针对于文件I/O,毕竟其他内容实在太多太多了…
NIO概述(文件I/O)
2002年2月13日,JDK1.4发布,工程代号为Merlin(灰背隼)。JDK1.4发布了很多新的特性,其中就包含NIO。
java.nio全称java non-blocking IO,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。
目的
将java.nio.*引入JavaIO库,是为了提高I/O的速度。速度的提高是因为所使用的结构非常接近于操作系统的I/O操纵方式:Channel(通道)、Buffer(缓冲器)。
Channel
Channel的概念可与I/O中的Stream(流)进行类比。不过Stream只是单向的,分为OutputStream和InputStream;而Channel则是双向的,可读可写。
nio中有一个专门的包,“java.nio.channels”:定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。
而基本的Channel类都实现了Channel接口:用于I/O连接。
常用的Channel有:
- FileChannel:用于读取、写入、映射和操作文件的通道。
- DatagramChannel:针对面向数据报套接字的可选择通道。
- SocketChannel:针对面向流的连接套接字的可选择通道。
此处只介绍 FileChannel
FileChannel
FileChannel需要通过三个类产生。三个类分别为:FileOutputStream,FileInputStream,RandomAccessFile
例:FileChannel fc=new FileOutputStream("filepathname").getChannel();
FileChannel fc=new RandomAccessFile("filepathname","mode").getChannel();
方法
- public abstract int read(ByteBuffer dst)throwsIOException
将此通道中的字节序列读入到缓冲区中。返回读入字节的长度,若达到末尾,则返回-1; - public abstract int write(ByteBuffer src)throws IOException
将字节序列从给定的缓冲区写入此通道。返回写入的字节数。 - public abstract long size()throws IOException
返回此通道的文件的当前大小。 - public abstract long transferTo(long position,long count,WritableByteChannel target)throws IOException
将字节从此通道的文件传输到给定的可写入字节通道。 - public abstract long transferFrom(ReadableByteChannel src,long position,long count)throws IOException
将字节从给定的可读取字节通道传输到此通道的文件中。
上两方法将两个通道直接进行相连
例: