文档章节

Java - NIO框架

 丰田破产标志
发布于 07/21 22:23
字数 830
阅读 12
收藏 0

Java NIO提供了与标准IO不同的IO工作方式。
Channels and Buffers(通道和缓冲区)
标准IO基于字节流和字符流,NIO基于通道(Channel)和缓冲区(Buffer)。数据从channel读取到buffer,或从Buffer写入到Channel

一些主要Channel的实现

  • FileChannel 从文件中读写数据
  • DatagramChannel 通过UDP读写网络中数据
  • SocketChannel 通过TCP读写网络中数据
  • ServerSocketChannel 监听进来的TCP连接,类似web服务器。每个新来的连接创建一个SocketChannel

示例:

Buffer的三个属性:capacity、position、limit

Buffer有如下几个类型:

  • ByteBuffer
  • MappedByteBuffer 比较特别
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Scattering Reads(Channel分散写入多个Buffer)

Gathering Writers(多个Buffer写入同一个Channel)

sactter/gather 经常用于需要将传输的数据分开处理的场合;如传输一个由消息头和消息体组成的信息,可以将消息体和消息头分散到不同的Buffer中,这样可以方便的处理消息头和消息体。

Non-blocking IO
java NIO可以非阻塞的使用IO;当线程从某channel进行读写数据时,若没有数据可用,该线程可进行其他任务。线程通常将非阻塞IO的空闲时间用于其他通道执行IO操作,所以单独的线程可管理多个输入和输出channel

Selectors(选择器)
NIO引入了选择器的概念,用于检查一个或多个Channel是否处于可读、可写。如此可实现单线程管理多个Channel,也就可用管理多个网络连接。

register()函数的第二个参数,是一个interest集合,代表Selector监听Channel时对什么事件感兴趣,有4种事件:

  1. SelectionKey.OP_ACCEPT
    接收连接就绪,代表Selector监听到了Channel,可以接收这个Channel了
  2. SelectionKey.OP_CONNECT
    连接就绪,代表Channel与Selector之间的连接已经成功建立
  3. SelectionKey.OP_READ
    读就绪,代表Channel中已有数据,可以进行读操作了
  4. SelectionKey.OP_WRITE
    写就绪,代表可以向Channel写数据了

SocketChannel(连接到TCP网络套接字的通道)
两种方式创建SocketChannel:

  1. 打开一个SocketChannel并连接到互联网上的某台机器
  2. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel

ServerSocketChannel

Pipe(管道)
Java NIO 管道是2个线程之间的单向数据连接,Pipe有一个source和sink通道。数据会被写到sink通道,从source读取。

IO与NIO区别

  1. 面向流与面向缓冲:
    IO面向流意味着每次 从流中读字节,它们没有被缓存到任何地方。NIO有缓冲区,增加了处理过程中的灵活性
  2. 阻塞与非阻塞IO:
    IO是阻塞的,意味着当一个线程read()或write()时,该线程被阻塞,不能做别的事。NIO的非阻塞模式,一个线程从某通道 发送请求读取数据,如果当前没有数据可获取,直至数据变的可以读取前,该线程可以做其他事。
  3. Selector(选择器)

© 著作权归作者所有

上一篇: Git
下一篇: Java - IO框架
粉丝 0
博文 7
码字总数 8156
作品 0
杭州
私信 提问
Java网络编程框架

自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持。做java网络编程需要掌握一些基本的知识和技能: 套接字编程、阻塞/非阻塞通信、创建HTTP服务器与客户程序、数...

长平狐
2012/08/29
2.3K
0
少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别

本文引用了“架构师社区”公众号的《史上讲的最好的Java NIO与IO的区别与应用》一文部分内容,感谢原作者的技术分享。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典...

JackJiang2011
06/25
0
0
Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao
2018/01/20
0
0
使用J2SE进行服务器架构技术选型的变迁

虽然现在对大多数程序员来讲,基本不会再有使用Java开发一个服务器这样的任务,但是,这方面的技术研究一下,对自己的技术提高还是非常有帮助的。说不定啥时候能派上用场。 使用Java(J2SE)...

webas
2013/04/26
57
0
Java NIO系列教程(十六) Java NIO Files

原文地址 译者:章筱虎 java NIO Files类(java.nio.file.Files) 提供了操作文件的相关方法。本篇文章将会覆盖大多数常用的方法。Files类包含了很多方法,如果你需要的功能在文中没有提及,需...

章 筱虎
2018/01/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部