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

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

通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。Channel 负责传输, Buffer 负责存储。通道是由 java.nio.channels 包定义的。 Channel 表示 IO 源与目标打开的连接。Channel 类似于传统的“流”。只不过 Channel本身不能直接访问数据, Channel 只能与Buffer 进行交互。

java.nio.channels.Channel 接口:

          |--FileChannel  本地文件的通道

          |--SocketChannel

          |--ServerSocketChannel

          |--DatagramChannel

网络的关于通道

获取通道

  1. Java 针对支持通道的类提供了 getChannel() 方法

          本地 IO:

          FileInputStream/FileOutputStream

          RandomAccessFile

 

          网络IO:

          Socket

          ServerSocket

          DatagramSocket

         

  2. 在 JDK 1.7 中的 NIO.2 针对各个通道提供了静态方法 open()

  3. 在 JDK 1.7 中的 NIO.2 的 Files 工具类的 newByteChannel()

package com.toov5.Nio;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import org.junit.jupiter.api.Test;public class BUfferTest02 {    // 非直接缓冲区 读写操作    @Test    public  void BUfferTest() throws IOException {        // 读入流        FileInputStream fileInputStream = new FileInputStream("aa.jpg");        // 写入流        FileOutputStream fileOutputStream = new FileOutputStream("bb.jpg");        // 创建通道        FileChannel iChannel = fileInputStream.getChannel(); // 读入流的通道        FileChannel oChannel = fileOutputStream.getChannel(); // 写入流的通道        //分配制定缓冲区大小      ByteBuffer byteBuffer    = ByteBuffer.allocate(1024);      while (iChannel.read(byteBuffer) != -1) {            //开启读取模式          byteBuffer.flip();          //将数据写入到通道中          oChannel.write(byteBuffer);          byteBuffer.clear();              }      //关闭通道、关闭连接      iChannel.close();      oChannel.close();      fileInputStream.close();      fileOutputStream.close();          }  }

 

运行结果:

 

 直接缓冲区:

package com.toov5.Nio;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.FileChannel.MapMode;import java.nio.file.Paths;import java.nio.file.StandardOpenOption;import org.junit.jupiter.api.Test;public class BUfferTest02 {    @Test    public void testZhiJie() throws IOException {        //创建管道    FileChannel inChannel =FileChannel.open(Paths.get("aa.jpg"), StandardOpenOption.READ);    FileChannel outChannel =FileChannel.open(Paths.get("bb.jpg"),StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE );    //定义映射文件    MappedByteBuffer inMappedByteBuffer =inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());    MappedByteBuffer outMappedByteBuffer =outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());    //直接对缓冲区操作     byte[] bytes = new byte[inMappedByteBuffer.limit()];     inMappedByteBuffer.get(bytes);     outMappedByteBuffer.put(bytes);      inChannel.close();      outChannel.close();      System.out.println("操作直接缓冲区完毕");    }                // 非直接缓冲区 读写操作    @Test    public  void BUfferTest() throws IOException {        // 读入流        FileInputStream fileInputStream = new FileInputStream("aa.jpg");        // 写入流        FileOutputStream fileOutputStream = new FileOutputStream("bb.jpg");        // 创建通道        FileChannel iChannel = fileInputStream.getChannel(); // 读入流的通道        FileChannel oChannel = fileOutputStream.getChannel(); // 写入流的通道        //分配制定缓冲区大小      ByteBuffer byteBuffer    = ByteBuffer.allocate(1024);      while (iChannel.read(byteBuffer) != -1) {            //开启读取模式          byteBuffer.flip();          //将数据写入到通道中          oChannel.write(byteBuffer);          byteBuffer.clear();              }      //关闭通道、关闭连接      iChannel.close();      oChannel.close();      fileInputStream.close();      fileOutputStream.close();          }  }

 

 

转载于:https://www.cnblogs.com/toov5/p/9932622.html

你可能感兴趣的文章
字符串类型的相互转换
查看>>
HTTP状态码
查看>>
iOS如何过滤掉文本中特殊字符
查看>>
基础学习:C#中float的取值范围和精度
查看>>
javaagent 简介
查看>>
python升级安装后的yum的修复
查看>>
Vim配置Node.js开发工具
查看>>
web前端面试题2017
查看>>
ELMAH——可插拔错误日志工具
查看>>
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>