特点:
为所有的原始类型提供 (Buffer) 缓存支持。
字符集编码解码解决方案。
Channel :一个新的原始 I/O 抽象。
支持锁和内存映射文件的文件访问接口。
提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 。
一个 buffer 主要由 position,limit,capacity 三个变量来控制读写的过程
参数 | 写模式 | 读模式 |
position | 当前写入的单位数据数量。 | 当前读取的单位数据位置。 |
limit | 代表最多能写多少单位数据和容量是一样的。 | 代表最多能读多少单位数据,和之前写入的单位数据量一致。 |
capacity | buffer 容量 | buffer 容量 |
Buffer 常见方法:
flip():
把 limit 设为当前 position ,把 position 设为 0 ,一般在从 Buffer 读出数据前调用。
rewind() :将 position 重置为 0 ,一般用于重复读。
clear() :一般在把数据写入 Buffer 前调用 ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。
compact(): 将未读取的数据拷贝到 buffer 的头部位。
mark() 、 reset():mark 可以标记一个位置, reset 可以重置到该位置。
Buffer 对象有可能是只读的,这时,任何对该对象的写操作都会触发一个 ReadOnlyBufferException。isReadOnly() 方法可以用来判断一个 Buffer 是否只读。
Buffer 常见类型:
ByteBuffer、MappedByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer
ByteBuffer wrap(byte [] array)
ByteBuffer wrap(byte [] array, int offset, int length)
把一个 byte 数组或 byte 数组的一部分包装成 ByteBuffer 。
Channel 常见类型:FileChannel、DatagramChannel(UDP)、SocketChannel(TCP)、ServerSocketChannel(TCP)
public class CopyFile { public static void main(String[] args) throws Exception { String infile = "C:\\copy.sql"; String outfile = "C:\\copy.txt"; // 获取源文件和目标文件的输入输出流 FileInputStream fin = new FileInputStream(infile); FileOutputStream fout = new FileOutputStream(outfile); // 获取输入输出通道 FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); // 创建缓冲区 ByteBuffer buffer = ByteBuffer.allocate(1024); while (true) { // clear方法重设缓冲区,使它可以接受读入的数据 buffer.clear(); // 从输入通道中将数据读到缓冲区 int r = fcin.read(buffer); // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1 if (r == -1) { break; } // flip方法让缓冲区可以将新读入的数据写入另一个通道 buffer.flip(); // 从缓冲区写入输入通道中 fcout.write(buffer); } }}