1.FileChannel

1.读的例子

 public static void read(String fileName) throws IOException {//第一种获取FileChannel的方法/* RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rw");FileChannel fileChannel1= randomAccessFile.getChannel();*///第二种获取FileChannel的方法File file = new File(fileName);FileInputStream inputStream = new FileInputStream(file);FileChannel fileChannel2=inputStream.getChannel();ByteBuffer byteBuffer = ByteBuffer.allocateDirect(2);int read = fileChannel2.read(byteBuffer);while (read!=-1){byteBuffer.flip();System.out.println(Charset.forName("GBK").decode(byteBuffer).toString());byteBuffer.clear();read = fileChannel2.read(byteBuffer);}//直接内存 https://blog.csdn.net/qq_30055391/article/details/85009551讲过相关知识DirectBuffer directBuffer=(DirectBuffer)byteBuffer;directBuffer.cleaner().clean();fileChannel2.close();inputStream.close();}

2.写的例子

public  static  void  write(String fileName) throws IOException {File file = new File(fileName);//如果需要不覆盖 需要在后面加上 true参数FileOutputStream fileOutputStream = new FileOutputStream(file,true);FileChannel fileChannel = fileOutputStream.getChannel();ByteBuffer byteBuffer = ByteBuffer.allocate(20);byteBuffer.put("new new new".getBytes());//对 position和limit进行设置 https://blog.csdn.net/qq_30055391/article/details/85009551讲过byteBuffer.flip();//因为不知道buffer里面的值会不会一下子写完 ,所以循环判断while (byteBuffer.hasRemaining()){fileChannel.write(byteBuffer);//把channel里面的数据只保留前3位 后面的数据截掉 例子里面只会写到文件上面一个newfileChannel.truncate(3);System.out.println(fileChannel.size());//强制把fileChannel里面的数据写到磁盘上面 因为有可能不是马上写入到硬盘上面的文件上面fileChannel.force(true);}fileChannel.close();fileOutputStream.close();}

3.什么时候该使用NIO?

如果你对读取或者写入文件的速度要求特别高,可以使用NIO里面的直接内存。
如果需要文件复制,可以使用NIO里面Channel的transferTo方法,比较方便。
如果你需要读取足够大(超过1个G的文件),在JVM内存吃紧的情况下可以使用NIO里面的MappedByteBuffer(基于虚拟内存)有兴趣可以看一下 。

2.SocketChannel

阻塞模式下的例子

  public static void  testBlock() throws IOException {SocketChannel socketChannel = SocketChannel.open();//绑定ip和端口号socketChannel.connect(new InetSocketAddress("10.252.69.254",5049));ByteBuffer byteBuffer = ByteBuffer.allocate(40);//阻塞到数据被读入bufferint alreadyread = socketChannel.read(byteBuffer);ByteBuffer byteBufferWrite = ByteBuffer.allocate(40);byteBuffer.put("write content".getBytes());while (byteBufferWrite.hasRemaining()){//阻塞到数据写入channelint alreadyWrite =socketChannel.write(byteBuffer);}socketChannel.close();}

非阻塞模式下的例子

 public void  testNoBlock() throws IOException {SocketChannel socketChannel = SocketChannel.open();//绑定ip和端口号socketChannel.connect(new InetSocketAddress("10.252.69.254",5049));//设置为非阻塞模式socketChannel.configureBlocking(false);ByteBuffer byteBuffer = ByteBuffer.allocate(40);//阻塞到数据被读入bufferint alreadyread = socketChannel.read(byteBuffer);//非阻塞模式下read方法会立即返回 所以要判断是否全部读取完毕while (alreadyread!=-1){socketChannel.read(byteBuffer);}ByteBuffer byteBufferWrite = ByteBuffer.allocate(40);byteBuffer.put("write content".getBytes());byteBuffer.flip();int alreadyWrite =socketChannel.write(byteBuffer);// 非阻塞write也会立即返回 所以要判断是否写入完成while (alreadyWrite!=-1){//阻塞到数据写入channelalreadyWrite =socketChannel.write(byteBuffer);}socketChannel.close();}

和传统的socket编程最大的区别就是提供了非阻塞的模式。并且可以跟selector结合实现管理多个端口的socket。但是实际情况用的不多。

3.SocketServerChannel

阻塞模式

    public static void testServeSocketBlocking() throws IOException {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//绑定端口号serverSocketChannel.socket().bind(new InetSocketAddress(5089));ByteBuffer byteBuffer = ByteBuffer.allocate(50);try {while (true) {//阻塞的SocketChannel socketChannel = serverSocketChannel.accept();int a = socketChannel.read(byteBuffer);while (a != -1) {byteBuffer.flip();System.out.println(socketChannel.getLocalAddress() + ":" + Charset.forName("utf-8").decode(byteBuffer).toString());byteBuffer.compact();a = socketChannel.read(byteBuffer);}}} finally {serverSocketChannel.close();}}

非阻塞模式 修改

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);while(true){//非阻塞直接返回  没有就直接返回nullSocketChannel socketChannel =serverSocketChannel.accept();if(socketChannel != null){//do something with socketChannel...}
}

#4.DatagramChannel
基于UDP协议的channel。

    public void udpTest() throws IOException {//UDP 协议下不需要连接 数据是按块接收的DatagramChannel dataProgramChanne = DatagramChannel.open();//接收数据dataProgramChanne.bind(new InetSocketAddress(8888));ByteBuffer buf = ByteBuffer.allocate(48);buf.clear();//如果数据包的数据过大,那么就会发生数据丢失dataProgramChanne.receive(buf);//发送数据dataProgramChanne.connect(new  InetSocketAddress("jenkov.com", 80));int bytesRead = dataProgramChanne.read(buf);int bytesWritten = dataProgramChanne.write(buf);}

四个Channel的讲解相关推荐

  1. JPA-CascadeType四个属性的讲解

    CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存.对应EntityManager的presist方法. 例子:只有A类新增时,会级 ...

  2. 14位125MSPS四通道ADC电路图讲解(通过后端数字求和增强SNR性能)_电工基础电路图讲解

    电路图简介: 所示电路是14位.125 MSPS四通道ADC系统的简化图,该电路使用后端数字求和将信噪比(SNR)从单通道ADC的 74 dBFS提升到四通道ADC的78.5 dBFS.这项技术特别适 ...

  3. 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)

    寻找数组第K大数是大厂面试中经常考到的一题,有的小机灵鬼直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱.面试官希望看到的是你对算法的理解,而不是函数的调用.下面,我就以 ...

  4. KKB:线程池、四个线程池讲解

    线程池 Executors 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,我们就需要频繁的创建线程和销毁线程,降低系统的效率.线程池就是一个容纳多个线程的容器,池中的线程可以 ...

  5. 四、golang类型讲解--go语言学习笔记

    擅自使用了七牛大牛们的PPT资料,希望不要怪罪,这里谢谢大牛们的分享. 映射 map 一个"键-值"对 关键点:注意并发读写情况,上锁 不能对未初始化的 map 进行写,会抛异常( ...

  6. css四种定位详细讲解

    在前端开发中,最重要的莫过于盒子的使用,在盒子中最常用的就是使用定位进行对盒子的位置的调整,这里我简单的介绍下这四种定位方式: 1.static:静态定位也是默认的定位方式,该定位是不脱标的定位方式, ...

  7. zookeeper -- 第四章 zookeeper watcher讲解

    2019独角兽企业重金招聘Python工程师标准>>> 先站坑 转载于:https://my.oschina.net/u/3136594/blog/1610091

  8. 刘一男四六级词汇来源讲解

    视频链接:   https://pan.baidu.com/s/1bGMecA      提取码:6tra

  9. TensoRT量化第四课:PTQ与QAT

    目录 PTQ与QAT 注意事项 一.2023/5/8更新 二.2023/5/12更新 前言 1. TensorRT量化 2. PTQ 3. QAT 4. QAT实战 4.1 环境配置 4.2 pyto ...

  10. 狗都能看懂的变化检测网络Siam-NestedUNet讲解——解决工业检测的痛点

    1.问题介绍 工业检测 如今深度学习的发展如火如荼,各类神奇的技术如人脸识别.换脸技术啥的,似乎什么问题都只需要Deep Learning一下就可以解决了.但这都是属于民用级别的技术,而真正想要在实际 ...

最新文章

  1. IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
  2. 从今天开始,学习Webpack,减少对脚手架的依赖(下)
  3. 喜欢产品小师妹?你必须知道的一点产品知识,竞品分析:流利说雅思
  4. ajax请求后台表格数据,商品后台表格数据的展现方式
  5. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
  6. Django-HttpResponse、render,、redirect(转载)
  7. jsp调用controller方法_SpringMVC五大核心组件及调用过程
  8. Python实现八皇后问题所有实现方式
  9. [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
  10. Controller @Autowired注解 无法注入值为null的问题
  11. 关于mysql的几个问题
  12. 用于无人驾驶技术的车道线_自动驾驶汽车可用于查找车道的4种技术
  13. [C/C++]如何在ARM环境下进行开发
  14. 经纬度转换坐标接口 查询位置信息
  15. VS2015安装VBpowerpacks工具箱教程
  16. 智能语音翻译APP——腾讯翻译君
  17. VP9编码(4)-- 约定
  18. 使用Roslyn动态编译代码
  19. 论程序员脱发是传言还是真的?
  20. 淘宝双11大数据分析(数据可视化)

热门文章

  1. css fixed定位失效问题
  2. 哪个软件可以测试服装的衣服,测试男生穿什么衣服的软件:男生脸型测试软件...
  3. 2018 中国Linux内核开发者大会
  4. 利用Python,通过关键字获取漏洞平台最新漏洞信息
  5. 利用全加器实现7段数码管_[走近FPGA]之数码管动态显示
  6. 厦门大学计算机系研究生课程《数据科学》课程主页
  7. cordova build时出错Minimum supported Gradle version is 5.4.1. Current version is 4.10.3
  8. 类与对象的属性与应用
  9. php搜索银行所在支行,多家银行宣布启动社区支行战略但风光不再
  10. weblogic安装与配置注意事项