Java NIO概述
广州为学教育科技有限公司 2018-11-30 21:37 359次浏览
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以多个数据通道。
NIO和传统IO(一下简称IO)之间个的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
Channel
首先说一下Channel,国内大多翻译成“通道”。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。
NIO中的Channel的主要实现有:·
FileChannel··
DatagramChannel··
SocketChannel·
ServerSocketChannel·
这里看名字就可以猜出个所以然来:分别可以对应文件IO、UDP和TCP(Server和Client)。下面演示的案例基本上就是围绕这4个类型的Channel进行陈述的。
Buffer
NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有MappedByteBuffer, HeapByteBuffer, DirectByteBuffer等这里先不进行陈述。
Selector
Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。
那些年我走过的弯路,疯狂JAVA把我拉回正道
人生究竟有没有弯路呢?是否走过的每段路都是必经之路?甚至是超越这平凡世界的途径?谈谈我的想法。
高中毕业那年,在朋友的怂恿下,在填写志愿的时候报了销售相关的专业,说销售容易赚大钱,每个月都能轻松过万。但到了大学毕业后,发现销售并不是我所想的那么简单,销售真的不那么好做,全凭一张嘴,大学里面学的东西几乎用不上,就这样,为人实在的我懵懵懂懂熬过了一年半,每个月就拿那两三千块钱的底薪,运气好就拿点提成,但到手的从来没有超过6000元,在广州这座大城市,想要买房子的话想要靠这点薪水根本不可能。
幸运的是,在一个偶然的机会遇到了我的小学同学,跟我同一年毕业,现在他已经是一家大公司的高级软件工程师了,年薪达到30万以上,还有公积金,准备在广州买房了。后来我问他是怎么办到的,他说他高中毕业那年就开始报名JAVA开发的培训,因为他认为互联网这个行业非常有发展前景,互联网的技术人才更是市场非常缺失的,如果往这个方向发展肯定能赢取不小的成就;另外,我大学也是报了相关的专业,大学四年里断断续续也做了一些项目,积累了一些经验,所以大学毕业后就被一家大型的互联网公司聘请了。我感到非常惊讶,但对自己一事无成,又不会什么能拿出手的技术,怎么拿那么高的薪水。正当我在抱怨自己的时候,他便说他可以把我介绍到我以前参加培训的那家机构报名参加培训,零基础也没关系,他们会用5个月的时间把你培养成一名合格的软件工程师,在培训期间也会接触到一些项目,到时候出去参加工作的时候就不会担心没有经验了。后来我想了一下,有一技在身,肯定不会饿死自己,便接受了小学同学的建议。果然不出我朋友所言,5个月后,那家培训机构根据我的能力把我推荐到一家公司上班,做软件开发,试用期间居然也能达到七千以上,转正后九千加项目提成,这样一来月入过万岂不是很轻松的事情?为了感谢小学同学的帮助,特意请他去吃大餐。
如果没有同学的介绍,如果没有那家培训机构老师的悉心教导,我也不会有今天的成就,你们是不是很羡慕呢?如果你们也是不想做销售,又想拿高薪的话,不妨上网也去那家机构了解一下,疯狂java:www.fkjava.org
联系:谢老师
手机:13632401219