Java NIO概述

Java之NIO概述 三个月没写博客了,主要也不知道写什么,光顾着向GitHub传题目了。理了下思路,并结合了《Thinking in Java》和API文档,分享了下自己对NIO的理解,当然这只是针对于文件I/O,毕竟其他内容实在太多太多了… NIO概述(文件I/O) 2002年2月13日,JDK1.4发布,工程代号为Merlin(灰背隼)。JDK1.4发布了很多新的特性,其中就包含NIO。 java.ni... 阅读详情

转自:http://www.cnblogs.com/dolphin0520/p/3919162.html

在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。

  以下是本文的目录大纲:

  一.NIO中的几个基础概念

  二.Channel

  三.Buffer

  四.Selector

  若有不正之处,请多多谅解并欢迎批评指正。

  请尊重作者劳动成果,转载请标明原文链接:

   http://www.cnblogs.com/dolphin0520/p/3919162.html

一.NIO中的几个基础概念

  在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。

  首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:

1
2
3
4
5
6
7
8
9
public  class  Test {
     public  static  void  main(String[] args)  throws  IOException  {
         File file =  new  File( "data.txt" );
         InputStream inputStream =  new  FileInputStream(file);
         byte [] bytes =  new  byte [ 1024 ];
         inputStream.read(bytes);
         inputStream.close();
     }  
}

   这里的InputStream实际上就是为读取文件提供一个通道的。

  因此可以将NIO 中的Channel同传统IO中的Stream来类比,但是要注意,传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而Channel是双向的,既可用来进行读操作,又可用来进行写操作。

  Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。比如上面的一段代码中,读取的数据时放在byte数组当中,而在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。

  下面介绍一下NIO中最核心的一个东西:Selector。可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。

  比如看下面的这个例子:

   

  用单线程处理一个Selector,然后通过Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐个地对这些事件进行响应处理。

二.Channel

  在前面已经提到,Channel和传统IO中的Stream很相似。虽然很相似,但是有很大的区别,主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写;

  以下是常用的几种通道:

  • FileChannel
  • SocketChanel
  • ServerSocketChannel
  • DatagramChannel

  通过使用FileChannel可以从文件读或者向文件写入数据;通过SocketChannel,以TCP来向网络连接的两端读写数据;通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据读写;通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。

  下面给出通过FileChannel来向文件中写入数据的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  Test {
     public  static  void  main(String[] args)  throws  IOException  {
         File file =  new  File( "data.txt" );
         FileOutputStream outputStream =  new  FileOutputStream(file);
         FileChannel channel = outputStream.getChannel();
         ByteBuffer buffer = ByteBuffer.allocate( 1024 );
         String string =  "java nio" ;
         buffer.put(string.getBytes());
         buffer.flip();      //此处必须要调用buffer的flip方法
         channel.write(buffer);
         channel.close();
         outputStream.close();
     }  
}

   通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容,至于具体原因将在下篇博文中具体讲述Buffer的用法时阐述。

三.Buffer

  Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:

  上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。

  在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:

  • ByteBuffer
  • IntBuffer
  • CharBuffer
  • LongBuffer
  • DoubleBuffer
  • FloatBuffer
  • ShortBuffer

  如果是对于文件读写,上面几种Buffer都可能会用到。但是对于网络读写来说,用的最多的是ByteBuffer。

  关于Buffer的具体使用以及它的limit、posiion和capacity这几个属性的理解在下一篇文章中讲述。

四.Selector

  Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

  与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。

  关于Selector类的具体使用将在后续文章中阐述。

  参考资料:

  http://blog.youkuaiyun.com/wuxianglong/article/details/6604817

  http://www.360doc.com/content/12/0515/11/1542811_211144310.shtml

  http://www.iteye.com/topic/834447

  http://weixiaolu.iteye.com/blog/1479656

  http://ifeve.com/overview/

tomcat,https加密方式(jsse.openssl) tomcat,https加密方式(jsse.openssl),亲自测试方法可行,真实有效。 立即下载

相关推荐

NCBI|叶绿体基因组数据上传

叶绿体基因组NCBI上传 小编最近在NCBI上传了好几次数据…想着可以把具体的上传步骤写下来,供大家参考。以下是叶绿体基因组的上传示例,大家可以瞅瞅 图片 准备工作 1.登录NCBI官网:https://www.ncbi.nlm.nih.gov/, 依次点击“sign in to NCBI”——“See more 3rd party sign in options”——搜索“Microsoft live.com”。 ”sign in to NCBI“ ”See more 3rd party sign i

weifanbio的博客 3900

使用 JSSE 和 NIO 实现非阻塞通信的一种快速方法

From IBM Developer Works http://www-900.ibm.com/developerWorks/cn/java/j-sslnb/Kenneth Ballard (kenneth.ballard@ptk.org)计算机科学系学生,珀鲁州立大学2003 年 11 月 尽管 SSL 阻塞操作——当读写数据的时候套接字的访问被阻塞——与对应的非阻塞方式相比

crazymens的专栏 2253

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

Java NIO (一)

Java NIO:NIO概述 Java NIO:NIO概述   在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。   以下是本文的目录大纲:   一.NIO中的几个基础概念   二.Channel   三.Buffe

至尊宝 676

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 983

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1880

tomcat8.5.95配置https报错 socket ,无法包装数据,状态无效[CLOSED] ,断开的管道

tomcat8.5.95配置https一直下面的错,经过一下午的排查解决了。1.注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。而io断开连接和无法包装数据是因为, 8.5.95已经修改了源代码。这个错误主要是conf/web.xml 没有配置,配上就好了。

专注AI大模型,软件混淆,授权 865

ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)

导读:   软件介绍   1、 CCPROXY 6.61 注册机(纯绿/傻瓜/真正去除线程限制)   ***前言,这次的升级官方改动不大,据说只是为了不被某些软件当病毒***   附件包中解压即免安装版,CcREGTOOLFF.exe为注册机。   本人继续向大家隆重推出《CCPROXY6.61哎呀……破解版》   还是那个提示:   在此之前,本人还是那句老话想提示大家,CCPROXY是

i53nd的专栏 1万+

tomcat10安装ssl证书异常处理

C:\Windows;28-Dec-2022 17:18:23.990 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=D:\Env\Tomcat10\conf\logging.properties。

irizhao的专栏 2103

Spine换装系统深度优化:从局部换肤到动态合批的进阶之路

本文深入探讨了Spine换装系统的性能优化策略,从局部换肤到动态合批的进阶技术。通过分析传统方案的性能瓶颈,提出动态合批、GPU Instancing等高级优化方法,显著降低Draw Call和内存占用,提升游戏性能。适用于MMO和大型游戏开发,帮助技术美术和工程师突破大规模换装场景的性能限制。

vulkan6gpu的博客 554

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 436

java nio类_Java NIO类概述

本篇博客的初衷是记录了博主本次阅读系列博客(Java NIO入门教程详解–链接见文末)全文过程中的一些笔记,描述了Java NIO中核心类以及其方法的作用;Buffer 属性 - capacity:容量 - limit:上界,缓冲区的临界区,即最多可读到哪个位置 - position:下标,当前读取到的位置(例如当前读出第5个元素,则读完后,position为6) ...

weixin_32103009的博客 227

从SSTS到CTS:解码汽车电子架构中的需求与实现规范

本文深入解析汽车电子架构中SSTS(子系统功能规范)与CTS(零部件技术规范)的转换过程,揭示从抽象需求到物理实现的关键步骤。通过实际案例说明如何将SSTS的功能逻辑、接口定义和性能指标转化为具体的CTS实施方案,并分享多供应商协同与测试验证的最佳实践,帮助开发者高效完成汽车电子系统开发。

weixin_29201859的博客 499

Java NIO 概述

Java NIO(New IO 或 Non Blocking IO)是从Java 1.4版本开始引入的一个新的 IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然 Java NIO 中除此之外还有很多类和组件,但 Channel,Buffer 和 Selector 构成了核心的 API。

二掌柜的博客 891

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java的NIO概述

NIO的核心组成部分 Channel Buffers Selectors 1. Channel和Buffer基本上,所有的IO在NIO中都从一个Channel开始。Channel有点象流。数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中。这里有个图示: Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现: - Fi

惜暮 904

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java NIO系列教程(一) Java NIO 概述

​Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。 Channel 和 Buffer 基本上,所有的 IO 在NIO 中都从一个Channel

weixin_51393513的博客 321

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

三、JAVA NIO概述

NIO 目录 文章目录三、JAVA NIO概述1、IO 概述1.2、同步并阻塞 IO (BIO)1.3、同步非阻塞 IO(NIO)1.4、异步非阻塞 IO(AIO)2、NIO 概述2.1、Channel2.2、Buffer2.3、Selector2.4、Channel 、Buffer 、Selector 三者关系2.5 NIO与BIO的对比 三、JAVA NIO概述 1、IO 概述 IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。 在 JDK1.4 之前,我们建

wang_luwei的博客 1540

Java NIO:NIO概述

在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。  以下是本文的目录大纲:  一.NIO中的几个基础概念  二.Channel  三.Buffer  四.Selector  若有不正之处,请多多谅解并欢迎批评指正。  请尊重作者劳动成果,转载请标明...

请叫我大师兄 1163

java nio 系列_Java NIO系列教程(一) Java NIO 概述

Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。Channel 和 Buff...

weixin_27155667的博客 159

java nio 教程例子_Java NIO系列教程(一) Java NIO 概述

Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。Channel 和 Buff...

weixin_31139027的博客 115

Java NIO概述与Buffer类

NIO概述 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。 IO与NIO的主要区别 1、面向流与面向缓冲 Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方...

JustinNeil的博客 630
上一篇: Java数据类型
下一篇: Java String类面试题
andybbc
博客等级 码龄11年 64粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值