1.文件IO
概述和核心API
缓冲区(Buffer):实际上是一个容器,是一个特殊的数组,缓冲区对象内置了一些机
制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,
但是读取或写入的数据都必须经由Buffer,如下图所示:
在NIO 中,Buffer 是一个顶层父类,它是一个抽象类,常用的Buffer 子类有:
ByteBuffer,存储字节数据到缓冲区
ShortBuffer,存储字符串数据到缓冲区
CharBuffer,存储字符数据到缓冲区
IntBuffer,存储整数数据到缓冲区
LongBuffer,存储长整型数据到缓冲区
DoubleBuffer,存储小数到缓冲区
FloatBuffer,存储小数到缓冲区
对于Java 中的基本数据类型,都有一个Buffer 类型与之相对应,最常用的自然是
ByteBuffer 类(二进制数据),该类的主要方法如下所示:
public abstract ByteBuffer put(byte[] b); 存储字节数据到缓冲区
public abstract byte[] get(); 从缓冲区获得字节数据
public final byte[] array(); 把缓冲区数据转换成字节数组
public static ByteBuffer allocate(int capacity); 设置缓冲区的初始容量
public static ByteBuffer wrap(byte[] array); 把一个现成的数组放到缓冲区中使用
public final Buffer flip(); 翻转缓冲区,重置位置到初始位置
通道(Channel):类似于BIO 中的stream,例如FileInputStream 对象,用来建立到目
标(文件,网络套接字,硬件设备等)的一个连接,但是需要注意:BIO 中的stream 是单向
的,例如FileInputStream 对象只能进行读取数据的操作,而NIO 中的通道(Channel)是双向的,
既可以用来进行读操作,也可以用来进行写操作。常用的Channel 类有:FileChannel、
DatagramChannel、ServerSocketChannel 和SocketChannel。FileChannel 用于文件的数据读写,
DatagramChannel 用于UDP 的数据读写,ServerSocketChannel 和SocketChannel 用于TCP 的
数据读写。
这里我们先讲解FileChannel 类,该类主要用来对本地文件进行IO 操作,主要方法如下所示:
public int read(ByteBuffer dst) ,从通道读取数据并放到缓冲区中
public int write(ByteBuffer src) ,把缓冲区的数据写到通道中
public long transferFrom(ReadableByteChannel src, long position, long count),从目标通道
中复制数据到当前通道
public long transferTo(long position, long count, WritableByteChannel target),把数据从当
前通道复制给目标通道