FileChannel in=new FileInputStream("D:\\abr.txt").getChannel();
File file=new File("D:\\abc.txt");
if (!file.exists()){
file.createNewFile();
}
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
FileChannel out=new FileOutputStream("D:\\abc.txt").getChannel();
while (in.read(byteBuffer)!=-1){
byteBuffer.flip();//prepare for writing
out.write(byteBuffer);
byteBuffer.clear();//prepare for reading
}
in.close();
out.close();
1.对于任何的基类流,getChannel()会产生一个FileChannel。通道是一种很基础的东西,可以向它传送用于读写的ByteBuffer,并且可以锁定文件的某些区域用于独占式的访问
2.字节存放于ByteBuffer的方法之一是:使用一种“put”方法直接对他们填充,填入一个或多个字节或基本数据类型。也可以使用warp()方法将已存在的字节数组包装放入ByteBuffer中。一旦如此,就不在复制低层的数组,而是把它作为所产生的ByteBuffer存储器,称之为数组支持的ByteBuffer
3.对于只读访问,我们必须显式的使用静态的allocate()方法来分配ByteBuffer。nio的目标就是快速移动大量的数据。也可以调用allocateDirect(),产生一个和操作系统有更高耦合度的“直接”缓存器
4.一旦调用read来告知FileChannel向ByteBuffer存储字节,就必须调用flip方法,让其做好别人读取字节的准备。如果我们打算使用缓存器执行进一步的read操作,我们也必须调用clear方法来为每个read做准备
5.每次read操作后,将会把数据写入缓存器,flip()则是准备缓存器以便它的信息可以由write()提取,write()操作后,信息依旧停留在缓存器,需要使用clear()方法对所有的内布指针重新安排,以便缓存器在另外read()中接受数据。