Java Nio

(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

你可能感兴趣的:(java,exception,String,IO,File,语言)