博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO通道(channel)原理与获取
阅读量:6381 次
发布时间:2019-06-23

本文共 2942 字,大约阅读时间需要 9 分钟。

一、通道(Channel): 用于源节点与目标节点的连接。在java NIO中负责缓冲区中数据的传输。Channel本身不存储数据,因此需要配合缓冲区进行传输。

二、通道的主要实现类

java.nio.channels.Channel接口:
|– FileChannel
|– SocketChannel
|– ServerSocketChannel
|– DatagramChannel

三、获取通道

1、java针对支持通道的类提供了getChannel()方法
本地IO:
FileInputStream/FileOutputStream
RandomAccessFile
网络IO:
Socket
ServerSocket
DatagramSocket
2、在jdk1.7中NIO.2针对各个通道提供了静态方法open()
3、在jdk1.7中NIO.2的Files工具类的newByteChannel()

@Test  //利用通道完成文件复制    public void test4() throws FileNotFoundException{        FileInputStream fis = new FileInputStream("1.mp4");        FileOutputStream fos=new FileOutputStream("2.mp4");        //1、获取通道        FileChannel inChannel = fis.getChannel();        FileChannel outChannel = fos.getChannel();        try {            //2、分配一个指定大小的缓冲区            ByteBuffer buf=ByteBuffer.allocate(1024);            //3、将通道中的数据存入缓冲区            while(inChannel.read(buf)!=-1){                //4、将缓冲区中的数据写入通道中                buf.flip();  //切换读取数据模式                outChannel.write(buf);                buf.clear();            }        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally{            try {                outChannel.close();            } catch (Exception e) {                e.printStackTrace();            }            try {                inChannel.close();            } catch (IOException e) {                e.printStackTrace();            }            try {                fos.close();            } catch (IOException e) {                e.printStackTrace();            }            try {                fis.close();            } catch (IOException e) {                e.printStackTrace();            }           }    }    @Test  //使用直接缓冲区完成文件的复制    public void test5() throws IOException{        FileChannel inChannel=FileChannel.open(Paths.get("1.mp4"),StandardOpenOption.READ);        FileChannel outChannel=FileChannel.open(Paths.get("2.mp4"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE_NEW);        //内存映射文件        MappedByteBuffer inMappedBuf=inChannel.map(MapMode.READ_ONLY,0,inChannel.size());        MappedByteBuffer outMappedBuf=outChannel.map(MapMode.READ_WRITE,0,inChannel.size());        //直接对缓冲区进行数据的读写操作        byte[] dst=new byte[inMappedBuf.limit()];        inMappedBuf.get(dst);        outMappedBuf.put(dst);        outChannel.close();        inChannel.close();    }

四、通道之间的数据传输

@Test  // 通道之间的数据传输(直接缓冲区)    public void test6() throws IOException{        FileChannel inChannel=FileChannel.open(Paths.get("1.mp4"),StandardOpenOption.READ);        FileChannel outChannel=FileChannel.open(Paths.get("2.mp4"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE);        //inChannel.transferTo(0,inChannel.size(),outChannel);   //二选一即可        outChannel.transferFrom(inChannel,0,inChannel.size());        outChannel.close();        inChannel.close();    }

转载地址:http://fjhqa.baihongyu.com/

你可能感兴趣的文章
关于Android热点模式下的UDP广播
查看>>
多态-典型用法
查看>>
学习笔记之pandas Foundations | DataCamp
查看>>
C++编程练习(14)-------“单例模式”的实现
查看>>
css学习_标签的显示模式
查看>>
《架构之美》摘录二
查看>>
JDK8 Lamdba表达式转换成Map,value为null问题
查看>>
python基础===正则表达式(转)
查看>>
如何让你的SQL运行得更快
查看>>
NewLife.XCode 上手指南(五) 复杂查询
查看>>
_02特性 给方法加上注释 或者停用
查看>>
第四十一天
查看>>
java2 -宏观了解
查看>>
lucene安装配置2
查看>>
【翻译】Ext JS最新技巧——2015-1-2
查看>>
Visual Studio快捷键不能使用解决办法
查看>>
delphi调用webservice接口时返回result element expected的解决办法
查看>>
执行perl adclonectx.pl出现错误
查看>>
初识Junit
查看>>
eclipse中没有server选项无法配置Tomcat
查看>>