IO流的认识

流的详细介绍

字符流和字节流:读取文件分为这两类,字符流read时是按每次两个字节(1字符按2字节,汉字也算一个字符)来读取的,而字节流读取时是按每次一个字节读取。通过相应的类,将字节流转化为字符流(InputStreamReader&OutputStreamWriter),更易于操作。一般flush()是空的没有实现代码。

缓冲流:作用相当于数据库的批量操作,每次读取一定量的数据到缓冲,用于各种操作,比如按行读取(以"\n"结束)。再比如写入时,执行flush()或内容达到缓存最大值,才会将数据写入硬盘。

File IO和Socket IO:其中File IO是阻塞IO,而Socket IO和四中模型相关联,分别为阻塞IO、非阻塞IO、多路复用IO、异步IO。NIO其实并非严格的非阻塞IO,它会阻塞在Selector的select方法上,属于多路复用IO。

BIO、NIO、AIO:其中BIO是原始socket编程,监听的输入流未有消息就阻塞。NIO是同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

几个概念:

阻塞 / 非阻塞:描述的是函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)。

同步 / 异步:描述的是执行IO操作的主体是谁,同步是由用户进程自己去执行最终的IO操作。异步是用户进程自己不关系实际IO操作的过程,只需要由内核在IO完成后通知它既可(比如执行完回调函数即可),由内核进程来执行最终的IO操作。

这两组概念交集在一起参生的非阻塞同步IO和非阻塞异步IO的概念就不难理解。

非阻塞同步IO:指的是用户调用读写方法是不阻塞的,立刻返回的,而且需要用户线程来检查IO状态。需要注意的是,如果发现有可以操作的IO,那么实际用户进程还是会阻塞等待内核复制数据到用户进程,它与同步阻塞IO的区别是后者全程等待。

非阻塞异步IO:指的是用户调用读写方法是不阻塞的,立刻返回,而且用户不需要关注读写,只需要提供回调操作,内核线程在完成读写后回调用户提供的callback。

 

 

读取并操作大文件时,怎么才能高效呢?

首先肯定不能全部读到内存操作,内存不够。

网上所说,有三种方法:

1、使用BufferedReader类读写超大文件

2、使用RandomAccessFile类读取

3、内存映射文件,通过java.nio包和MappedByteBuffer可以从内存直接读写文件。其中,FileChannel是连接到文件的通道,由读取文件的流对象中获取,由通道FileChannel.map(MapMode.READ_ONLY, 0, fChannel.size())获得。当size大于Integer最大值时会报错,可通过size大于以Integer最大值分割为若干段,用MappedByteBuffer数组来映射

 

网上一张图:

猜你喜欢

转载自1181731633.iteye.com/blog/2355809
今日推荐