搜索
简帛阁>技术文章>JAVA语言中的I/O简介

JAVA语言中的I/O简介

一:BIO同步阻塞
java中最原始的对文件资源和网络上的资源的读取使用的是BIO模型。这种模型的实现使用的是流的概念对数据进行读取,流是单向的分为输入流和输出流,输入流只能用于从文件或网络上读取数据,输出流只能用于向网络或文件中写数据,这种读写是同步阻塞的,线程只能在读写完毕的情况下才能去做别的事情。
在java的实现中有两个类InputStream和OutputStream是所有输入和输出流的超类,且都位于java.io包中。其所有子类的读写都是采用的这种模型。文件的读写如FileInputStream,网络上的读写如默认的socket。
二:NIO
Nio中的N是new的意思是java1.4新加的特性,位于java.nio包中,这种通信模型实际上使用的是io模型中的多路复用技术。这种模型在java中的实现不是用的流的概念,其核心的几个概念是选择器、通道和缓冲区,一个通道对应的网络上或文件中的一个资源,通道是双向的支持读和写,数据读到缓冲区或者从缓冲区向目标资源写数据,多个通道可以注册到一个选择器中,选择器可以去监听这些通道中的数据是否可读可写,如果可读或可写就直接返回。
NIO可分为阻塞和非阻塞两种模式,对文件的读写使用的是阻塞模型,直接使用通道进行读取,对网络上数据的读写使用的是非阻塞模型。
BIO的读取是需要从内核将数据复制到用户进程空间中的。NIO中的字节缓冲区分为两种,直接缓冲区和非直接缓冲区,非直接缓冲区和BIO的读写类似,直接缓冲区是直接在用户进程空间外开辟内存空间,内核也直接映射到该空间,直接进行数据的读取,减少数据在内存中的一次复制操作,这个需要操作系统中虚拟内存的支持。在java的实现中‘’ByteBuffer.allocateDirect(1024)‘申请的是直接缓冲区,‘’ByteBuffer.allocate(1024)‘申请的非直接缓冲区。
直接缓冲区和非直接缓冲区的区别:
字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。
直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。
直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer 。 Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。
字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect() 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。
直接和非直接缓冲区的示意图如下:


三:NIO2
java中的NIO2是对AIO模型的实现,真正的实现了异步非阻塞,但是linux对AIO的支持不完善,所以应用很少。
关于java中对nio的具体实现请看下篇《java语言中文件读取对NIO的具体实现》

一:BIO同步阻塞java中最原始的对文件资源和网络上的资源的读取使用的是BIO模型。这种模型的实现使用的是流的概念对数据进行读取,流是单向的分为输入流和输出流,输入流只能用于从文件或网络上读取数据,
放大再看,注意视力!哈哈一口吃不成胖子,一点一点的看:大家都是文化人,拿图要指明出处!!!头上↑那框,对,就是那使用的是XMind软件画的,要源文件吗?在这里:https://githubcom/RD
I/O流流:通过不同输入设备(键盘、内存、显示器、网络等)之间的数据传输抽象表示为“流”I/O流分类:字节流和字符流:根据流操作的数据单位不同,可以分为字节流和字符流。字节流以字节为单位进行数据的读
JavaI/O总结JavaI/O操作主要是指使用Java进行输入,输出操作Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。数据流是一串连续不断的数据的
1流流是一组有序的数据序列,I/O流提供了一条通道程序,我们使用这个通道可以把源中的字节输送到目的地。我们经常使用I/O流与磁盘的文件打交道,但是程序的源和目的地可以使内存,键盘,鼠标等等。输入输出硬
序列化:将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程对于Java这种面向对象编程语言来说,我们序列化的都是对象(Object)也就
一、什么是I/O、流I/O就是数据的输入输出流就是一个数据的序列二、I/O的基本类库结构1、基于字节操作的I/O接口:InputStreamOutputStream2、基于字符操作的I/0接口:Wr
O多路复用模型广泛的应用于各种高并发的中间件中,那么区别于其他模式他的优势是什么、其核心设计思想又是什么、其在Linux中是如何实现的?I/O模型I/O模型主要有以下五种:同步阻塞I/OI/O操作
关概念同步和异步描述的是用户线程与内核的交互方式:同步是指用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行;异步是指用户线程发起I/O请求后仍继续执行,当内核I/O操作完成后
对于JavaI/O来说,I意味着Input(输入),O意味着Output(输出)。读书写作并非易事,而创建一个好的I/O系统更是一项艰难的任务。古人云:“读书破万卷,下笔如有神”。也就是说,只有大量的