关于我对nio的理解
1.什么是nio?
nio:数据容器的缓冲区,数据存储在缓冲区(buffer)里面,可以读和写。
然后缓冲区在管道中流动,实现文件的读写还有复制。
io:文件都是以流的方式进行传输
2.io和nio的区别
nio:面向缓冲区,非阻塞nio,选择器,双向(缓冲区可以双向)
io: 面向留,阻塞io,单向(输入用InputStream,输出用OutputStream)
3.nio包中的常用类、接口
(抽象类)Buffer:Buffer子类有7个,分别是ByteBuffer、ShortBuffer、IntBuffer、LongBuffer、
CharBufffer、FloatBuffer、DoubleBuffer
(接口)Channel:管道,用来转载缓冲区,如何获得一个管道(文章下面有代码关于如何获得一个管道,如何装载缓冲区)
4.nio的使用
(1)进队缓冲区的读和写
首先定义一个缓冲区: ByteBuffer bb=ByteBuffer.allocate(1024);
ByteBuffer是没有构造方法的,只能通过调用其静态方法allocate(int capacity)
获得一个对象,其中capacity是缓冲区的大小,即你要开辟多大的空间来存储数据
写数据进缓冲区: bb.put("abc".getBytes()) 将字符串abc转为byte数组,然后将
byte数组写进缓冲区,就将字符串写进了缓冲区。put()有许多重
载方法,可以根据自己需要选择。
从缓冲区读数据:bb.get()读取一个Byte数据 bb.array()读取全部数据获得一个Byte[],
要显示成字符串需要类型转换。get()也有许多重载方法,根据需要选择。
注意:如果你刚写完数据到缓冲区,而你又要马上读数据,你需要调用flip()方法来调一下
缓冲区的当前的位置,调到缓冲区的起始位置。否则你是读不到数据的。为什么呢?
因为你刚写数据时,缓冲区的位置已经偏移了一定长度(数据的长度),而你马上读
数据,就从当前位置开始读,这样是读不到数据的。
(2)利用缓冲区来对文件的进行读和写
通过代码来看一下nio的文件复制
File file=new File("aa.txt");//要读的目标文件
File filecopy=new File("bb.txt");//要写的目标文件
FileInputStream is=new FileInputStream(file);//定义一个文件输入流
FileOutputStream os=new FileOutputStream(filecopy);//定义一个文件输出流
ByteChannel in=is.getChannel();//获取一个输入管道
ByteChannel out=os.getChannel();//获取一个输出管道
ByteBuffer dst=ByteBuffer.allocate(is.available()) ;//定义一个缓冲区 is.available()是文件可读的长度
in.read(dst);//在输入管道装载数据到缓冲区,即将目标文件写入缓冲区
System.out.println(new String(dst.array()));
dst.flip();//调缓冲区的位置到起始位置
out.write(dst);//在输出管道中将文件从缓冲区写到目标文件
//关闭管道,流还有清空缓冲区
is.close();
os.close();
in.close();
out.close();
dst.clear();