(1)NIO
a) Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器.
(2)如何操作nio读写数据
Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道进行直接操作.在使用卡车前首先我们需要一个卡车(ByteBuffer)我们可以使用ByteBuffer的静态方法allocate或者allocateDirect方法构造出ByteBuffer实例(有点像C语言中的malloc函数).使用FileChannel的write/read方法进行装卸,write方法可以想象成卸载煤矿,在卸载前需要调用ByteBuffer的flip方法,read方法可以想象成装载,装载前调用clear方法.一下是个简单的势力:
public static void main(String[] args) throws Exception {
File srcf=new File("D:\\aa.mp4");
File tarf=new File("D:\\ww.mp4");
FileInputStream fis=new FileInputStream(srcf);
FileOutputStream fos=new FileOutputStream(tarf);
FileChannel fic=fis.getChannel();
FileChannel foc=fos.getChannel();
ByteBuffer buf=ByteBuffer.allocate(1024);
while (fic.read(buf)!=-1) {
buf.flip();
foc.write(buf);
buf.clear();
}
fic.close();
foc.close();
}
(3)视图缓冲
a) 视图缓冲可以让我们更直观的向"卡车(ByteBuffer)"中写入读取基本类型,对视图的修改都会映射成对ByteBuffer中数据的修改.比如写入char型数据可以使用ByteBuffer的 asCharBuffer获得视图CharBuffer然后使用put/get方法写入获取char类型数据.视图的类型:IntBuffer,Shor-
tBuffer,LongBuffer,DoubleBuffer,CharBuffer,FloatBuffer
(4)操作ByteBuffer:
a) 操作ByteBuffer方法有:
1. position返回/设置当前位置
2. limit 返回/设置界限
3. mark 记录mark值为当前position值
4. reset 重置position为mark值
5. remaining返回当前位置与限制之间的元素数
6. hasRemaining返回当前位置与
7. flip()将当前position设置为limit,将position设置为0
将ByteBuffer中的position想象成在一个栈中的指针,那么在从ByteBuffer取出字节像管道写入的时候就要将指(position)设置在0上然后不断的取出字节指导指针到达数据结尾(limit处)所以写入的时候就要使用flip()方法。从管道取出字节写入到ByteBuffer要将内部的指针设置0 然后清空其内的数据就要使用read方法。
(5)使用Charset:
使用CharSet可以对字节序列进行编码,对字节序列进行编码,静态方法forName("编码类型(GBK之类)")获得CharSet对象
a) encode(String):对参数进行编码,把得到的字节序列放在一个ByteBuffer对象中,并返回
b) Encode(CharBuffer)对参数进行编码,把得到的字节序列放在一个buteBuffer中并返回
c) CharBufferdncode(ByteBuffer):将参数字节序列编码放在CharBuffer中,并返回.
编码与反编码前后使用flip反转缓存limit为position position为0