IO包括输入和输出2方面内容。在Java设计中IO是什么样的一个架构呢?
首先分成2部分,一部分是最基本的字节流,都继承自InputStream/OutputStream,说到底,计算机底层传输的就是字节嘛,不可能是某种特定字符集的字符。那么针对字节流,从哪里来到哪里去,就能够划分好几个种类:比如ByteArray、Data、Object、File、Sequence、Pipe。划分好之后,出于性能考虑又加上了Buffer的装饰类来包装具体的字节流类型。到这里,字节流的IO操作差不多就可以满足大多数要求了。
这时候,有些人就说了我们平时处理最多的就是文件类型了,你们能不能设计一套针对字符的IO流?OK,没问题,接着Reader/Writer就诞生了,字符就没有字节那么多复杂的种类了,简简单单:CharArray、File、Pipe等等,同样在性能考虑上面加入了Buffer来包装具体的字符流。现在大家都满意了,不过等等,问题有出来了,有人说我字符流读进来是乱码,怎么回事?原来是源文件字符集和系统默认字符集不统一,这时候字节流和字符流之间的沟通桥梁InputStreamReader/OutputStreamWriter隆重登场,可以完美解决转换中间的乱码问题。
传统的IO整个框架差不多就是上面介绍的了,普通的应用场景,传统的IO已经足够能满足需求了。但是对于一些特殊的应用场景,诸如连接数量非常多,但是时间都不长(典型的就是聊天室了),使用传统的IO的话,数量繁多的线程管理就给整个系统带来了巨大的压力,这时候有人就问了,能不能用一个线程管理所有的链接呢?其实Java1.4版本中间的NIO就能满足类似场景的需求。NIO大体分3块内容,Channel、Buffer、Selector。我们平时开发就主要和Buffer打交道,内部Buffer会和Channel通信,所以和传统IO相比,NIO是面向缓冲的开发。如果单单只是这样的话,其实还是不能满足先前的要求,这时候通过Channel来设置成非阻塞模式,这样多个Channel之间在一个线程里面就不会相互干扰。最后的Selector其实就是管理多个注册过的Channel,说到底就是一个监听者。不过需要注意的是,NIO中的FileChannel是不能设置成非阻塞模式的。最后需要特别注意的是,把buffer写到Channel之前,需要调用flip()修改buffer为读模式,这时候不能保证buffer是否已经写完,所以要用while做保证。
相关推荐
系统的主要功能和特色可归纳为以下几点: 首先,水系展示系统是该防洪指挥决策系统的基础组成部分。它具备对洪泽县水系的全景式描绘,包括河道、干渠、闸站等关键水利设施的精确位置及水流方向。这一功能对于管理者...
根据给定文件的信息,我们可以将相关知识点归纳如下: ### 一、Java基础概念 #### 1.1 什么是Java? Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司在1995年发布。它旨在简化C++语言的复杂性,...
根据给定的信息,我们可以归纳出以下关于“Java写字板”项目的相关知识点: ### 一、项目背景 本项目是华北科技学院计算机系开设的《Java程序设计B》课程中的一个综合性实验项目。该项目的主要目的是让学生通过...
根据提供的文件信息,我们可以归纳出一系列与德国普莱格(Pleiger)模块相关的专业知识点。这份手册主要涉及了普莱格控制模块(PCM-Manual)的详细信息,特别是其阀门控制系统系列。以下是对该手册内容的一个综合...
PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如 用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析Windows驱动 开发的本质。 ...
从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对...
②不需并行编程器仅需用P15,P16 和P17,这三个IO 仅仅是下载程序的时 候使用,并不影响程序的使用。 ③结合上位机软件免费就可实现PC 对其编程硬件电路连接简单如图3.3 所 示。 104 C3 1K R1 S1 VCC D1 1N4007 ...