您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java NIO的三大核心配件:通道、缓冲区、选择器

时间:2021-04-16 13:24:09  来源:今日头条  作者:幻风的成长之路

NIO的三大核心配件

Java NIO的三大核心配件:通道、缓冲区、选择器

 

channel(通道)

Buffer(缓冲区)

selector(选择器)

 

案例介绍

读写切换

 

public static void main(String[] args) {
    //创建一个Buffer,大小为5,可就是可以存放5个int
 IntBuffer intBuffer=IntBuffer.allocate(5);
 for(int i=0;i<intBuffer.capacity();i++){
        intBuffer.put(i*2);
 }
    //读写切换
 intBuffer.flip();
 while(intBuffer.hasRemaining()){
        System.out.println(intBuffer.get());
 }
}

本地方法写

public static void main(String[] args) throws IOException {
 String str="hello";
 //创建一个输出流
 FileOutputStream fileOutputStream=new FileOutputStream("src/test/JAVA/com/hua/nio/a");
 //通过fileOutputStream获取对应的FileChannel,这个FielChannel的真实类型是FileChannelImpl
 FileChannel fileChannel=fileOutputStream.getChannel();
 //创建一个缓冲区ByteBuffer
 ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
 //将str放到byteBuffer
 byteBuffer.put(str.getBytes());
 //对byteBuffer.flip();
 byteBuffer.flip();
 //把byteBuffer的数据写入到fileChannel
 fileChannel.write(byteBuffer);
 fileOutputStream.close();
}

本地方法读

public static void main(String[] args) throws IOException {
    File file=new File("src/test/java/com/hua/nio/a");
 FileInputStream fileInputStream =new FileInputStream(file);
 FileChannel fileChannel=fileInputStream.getChannel();
 ByteBuffer byteBuffer= ByteBuffer.allocate((int)file.length());
 //将通道的数据读入到Buffer
 fileChannel.read(byteBuffer);
 //将byteBuffer的字节数据转成String
 System.out.println(new String(byteBuffer.array()));
 fileInputStream.close();
}

数据的双向交互

 

public static void main(String[] args) throws IOException {
    FileInputStream fileInputStream=new FileInputStream("src/test/java/com/hua/nio/a");
 FileOutputStream fileOutputStream=new FileOutputStream("src/test/java/com/hua/nio/b");
 FileChannel fileChannel1=fileInputStream.getChannel();
 FileChannel fileChannel2=fileOutputStream.getChannel();
 ByteBuffer byteBuffer= ByteBuffer.allocate(512);
 while(true){
        //必须要clear,当下面fileChannel2的write的时候,此时的position会从0开始到limit,如果不clear回归到原来,
 //当position和limit相等的时候,fileChannel1.read的返回结果为-1
 byteBuffer.clear();
 int read=fileChannel1.read(byteBuffer);
 System.out.println(read);
 if(read == -1){
            break;
 }
        byteBuffer.flip();
 fileChannel2.write(byteBuffer);
 }
    fileInputStream.close();
 fileOutputStream.close();
}

通道的数据转换

public static void main(String[] args) throws IOException {
    FileInputStream fileInputStream =new FileInputStream("src/test/java/com/hua/nio/a");
 FileOutputStream fileOutputStream=new FileOutputStream("src/test/java/com/hua/nio/c");
 FileChannel fileChannel1=fileInputStream.getChannel();
 FileChannel fileChannel2=fileOutputStream.getChannel();
 fileChannel2.transferFrom(fileChannel1,0,fileChannel1.size());
 fileChannel1.close();
 fileChannel2.close();
 fileInputStream.close();
 fileOutputStream.close();
}

类型的buffer

public static void main(String[] args) {
    ByteBuffer buffer= ByteBuffer.allocate(64);
 buffer.putInt(100);
 buffer.putLong(5);
 buffer.putChar('天');
 buffer.putShort((short)11);
 buffer.flip();
 System.out.println();
 System.out.println(buffer.getInt());
 System.out.println(buffer.getLong());
 System.out.println(buffer.getChar());
 System.out.println(buffer.getShort());
}

只读的buffer

public static void main(String[] args) {
    ByteBuffer buffer= ByteBuffer.allocate(64);
 for(int i=0;i<64;i++){
        buffer.put((byte)i);
 }
    buffer.flip();
 //设置byteBuffer是只读的
 ByteBuffer readOnlyBuffer=buffer.asReadOnlyBuffer();
 System.out.println(readOnlyBuffer.getClass());
 while(readOnlyBuffer.hasRemaining()){
        System.out.println(readOnlyBuffer.get());
 }
}

内存上的修改

public static void main(String[] args) throws IOException {
    RandomaccessFile randomAccessFile=new RandomAccessFile("src/test/java/com/hua/nio/a","rw");
 FileChannel channel=randomAccessFile.getChannel();
 //FileChannel.MapMode.READ_WRITR使用的是读写模式
 //第一个参数表示直接修改的起始位置
 //第二个参数表示映射到内存的大小
 //也就是说我们只能修改0到4的索引位置,
 MAppedByteBuffer mappedByteBuffer=channel.map(FileChannel.MapMode.READ_WRITE,0,5);
 mappedByteBuffer.put(0,(byte)'H');
 mappedByteBuffer.put(2,(byte)'L');
 randomAccessFile.close();
}


Tags:Java NIO   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  Tags: Java NIO  点击:(16)  评论:(0)  加入收藏
NIO的三大核心配件 channel(通道)Buffer(缓冲区)selector(选择器) 案例介绍读写切换 public static void main(String[] args) { //创建一个Buffer,大小为5,可就是可以存放...【详细内容】
2021-04-16  Tags: Java NIO  点击:(304)  评论:(0)  加入收藏
在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。创建一个AsynchronousFileChannel我们可以使用As...【详细内容】
2020-08-06  Tags: Java NIO  点击:(49)  评论:(0)  加入收藏
NIO(1)基本介绍1)Java NIO全程 java non-blocking IO,是指JDK提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO,是同步非阻塞的2)NIO相关类都被放在...【详细内容】
2019-12-11  Tags: Java NIO  点击:(54)  评论:(0)  加入收藏
NIO2.0时代1. 变更通知(因为每个事件都需要一个监听者)对NIO和NIO.2有兴趣的开发者的共同关注点在于Java应用的性能。根据我的经验,NIO.2里的文件变更通知者(file change notifi...【详细内容】
2019-09-17  Tags: Java NIO  点击:(134)  评论:(0)  加入收藏
NIO的背景为什么一个已经存在10年的增强包还是Java的新I/O包呢?原因是对于大多数的Java程序员而言,基本的I/O操作都能够胜任。在日常工作中,大部分的Java开发者没有必要去学习N...【详细内容】
2019-09-17  Tags: Java NIO  点击:(145)  评论:(0)  加入收藏
概述 在使用Java NIO和多线程来进行高并发Java服务端应用程序设计时,通常是基于Reactor线程模型来设计的。Reactor,即包含一个Java NIO的多路复用选择器Selector的反应堆,当有...【详细内容】
2019-08-28  Tags: Java NIO  点击:(265)  评论:(0)  加入收藏
Java 之所以能够霸占编程语言的榜首,其强大、丰富的类库功不可没,几乎所有的编程问题都能在其中找到解决方案。但在早期的版本当中,输入输出(I/O)流并不那么令开发者感到愉快:1)J...【详细内容】
2019-07-24  Tags: Java NIO  点击:(272)  评论:(0)  加入收藏
Java NIO全称Java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网...【详细内容】
2019-07-22  Tags: Java NIO  点击:(424)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条