NIO通道(channel)原理与获取

Wesley13
• 阅读 328

一、通道(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();
    }
点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
2个月前
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Wesley13 Wesley13
1年前
Java NIO 三大组件之 Channel
Java NIO 之 Channel ================== ### 一、什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作。 在Java NIO中负责缓冲区中数据的传输。Channel本省不存储数据,因此需要配合缓冲区进行传输。(个人理解其实就是相当于保存两通信地间的
Wesley13 Wesley13
1年前
Java NIO学习笔记
#### Java NIO是什么 Java NIO( New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同, NIO支持面向缓冲区的、基于通道的IO操作。 NIO将以更加高效的方式进行文件的读写操作。 #### Java NIO 与 IO
Wesley13 Wesley13
1年前
Java Nio 线程
* Java NIO(New IO)是从Java 1.4版本开始引入的  一个新的IO API,可以替代标准的Java IO API。  NIO与原来的IO有同样的作用和目的,但是使用  的方式完全不同,NIO支持面向缓冲区的、基于  通道的IO操作。NIO将以更加高效的方式进行文  件的读写操作 * Java NIO 与 IO 的主要区别
Stella981 Stella981
1年前
Netty之缓冲区ByteBuf解读(一)
![](https://oscimg.oschina.net/oscnet/up-6de4d71f462d9846befe00ec6505125a928.JPEG) \> Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率。虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也
Wesley13 Wesley13
1年前
Java NIO系列教程(五) 通道之间的数据传输
在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。 **transferFrom()** FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解
Wesley13 Wesley13
1年前
Java NIO编程学习总结
##目录 * 1、同步,异步,阻塞,非阻塞的理解 * 2、什么是 BIO、NIO、AIO * 3、java NIO 常用类和方法介绍 * 3.1. 缓冲区 Buffer * 3.2. 通道 Channel * 3.2.1 FileChannel * 3.2.2 SocketChan
Wesley13 Wesley13
1年前
Java Nio
(1)NIO a)  Nio之所以比旧的io速度快是因为,nio使用的结构更接近于系统操作执行io的操作:通道和缓冲器. (2)如何操作nio读写数据 Nio读写方式可以想象成:数据源和数据目的地是煤矿与煤场,通道想象成告诉公路,缓冲器是卡车,nio中的FileChannel是装卸煤用的工具,ByteBuffer是装煤用的卡车.在新的io中我们不对通道
可莉 可莉
1年前
08. Java NIO FileChannel 文件通道
Java NIO中的FileChannel是用于连接文件的通道。通过文件通道可以读、写文件的数据。Java NIO的FileChannel是相对标准Java IO API的可选接口。 FileChannel不可以设置为非阻塞模式,他只能在阻塞模式下运行。 打开文件通道(Opening a FileChannel) --------------------