`

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数组来映射

 

网上一张图:

分享到:
评论

相关推荐

    io流的认识练习

    在这个"io流的认识练习"中,我们将深入探讨这两个关键概念。 首先,`File`类提供了许多方法来操作文件和目录。例如,`exists()`用于检查文件或目录是否存在,`mkdirs()`用于创建多级目录,`renameTo()`用于重命名...

    Java之IO流学习总结.pdf

    首先,我们来认识IO流中的基本类。在Java中,所有与IO相关的类都位于java.io包中。主要的抽象基类有InputStream、OutputStream、Reader和Writer。InputStream和OutputStream是处理字节数据的基类,而Reader和Writer...

    java_IO学习代码

    通道(如FileChannel)和缓冲区(ByteBuffer)是NIO的核心概念,它们与传统的IO流不同,能更好地支持并发。 Java IO的另一个重要方面是流的处理方式,例如使用文件复制作为示例,我们可以看到如何将一个文件的内容...

    IO文件读取

    在IT行业中,文件读取是基础且至关重要的操作,尤其在处理输入/输出(IO)时。本主题将深入探讨“IO文件读取”的概念、方法以及...通过以上介绍,你已经对Java中的文件读取有了全面的认识,可以灵活地应用于各种场景。

    javaIO struts2的一些相关资源

    在描述中提到的文件"031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf"可能详细介绍了字节流和字符流的概念。字节流处理原始二进制数据,适用于所有类型的数据,包括图片、音频等;字符流处理文本数据,通常基于...

    java + swing + io + 多线程 +聊天室

    通过这个项目,学习者可以深入理解Java GUI编程、网络通信、多线程和IO流的实践应用,同时对数据结构、设计模式和异常处理有更深入的认识。在实践中不断调试和优化代码,将有助于提升编程技巧和问题解决能力。

    电影院售票系统

    Java的类库提供了丰富的IO流API,用于读写数据,无论是与客户端之间的通信,还是读取或保存XML文件,都离不开IO流的支持。 **IO流**是Java中的核心概念之一,它允许程序与外部设备(如硬盘、网络、键盘、显示器等)...

    ConhecaCoreia.github.io:认识韩国主要网站

    认识韩国主要网站 由社区制作的网站。 要查看,请使用地址ConhecaCoreia.github.io 主要目的是披露其他传播流行韩国信息,官方网站,旅游网站等信息的网站。 第二个目标是从“流行韩国”,图片,杂志,报纸等中传播...

    云计算技术实验报告五Hadoop IO

    - 本次实验进一步巩固了对Hadoop IO操作的理解,特别是对于文件的压缩和合并等高级功能有了更深入的认识。 - 掌握了使用Gzip进行文件压缩的方法,这对于大数据处理场景下的存储优化尤为重要。 2. **问题解决**: ...

    东芝CV180手册 IO-MLT基板说明.docx

    通过对东芝CV180手册中IO-MLT基板的详细介绍,我们不仅了解了该基板的基本结构和功能,还对其核心部件如操作开关、检查销、连接器及电位器等有了更深入的认识。这对于电梯维修人员和技术支持团队来说至关重要,能够...

    单片机C语言实例IO输出-点亮1个LED灯方法1.zip

    9. **电路连接**:LED灯要正确连接到单片机的IO口,通常需要串联一个限流电阻,以防止过高电流损坏LED。 通过理解和实践这个“点亮1个LED灯”的实例,开发者能够建立起对单片机C语言编程的基础认识,为进一步学习...

    CPS-1616 16-Port, 16-Lane, 80Gbps,Gen2RapidIO Switch 数据手册.pdf

    根据给定文件信息,以下是关于"CPS-1616 16-Port, 16-Lane...通过了解以上知识点,可以对CPS-1616这款RapidIO Gen2交换机有全面的认识,包括其关键特性和应用场景,以及它如何满足高速数据通信和网络连接的高标准要求。

    3-3、认识进程与线程(网络编程)学习PPT

    * 基本IO模型:数据流的概念。 * 非阻塞套接字与非阻塞IO模型:非阻塞IO模型、非阻塞套接字、非阻塞套接字。 * IO多路复用实现:注册事件、IO复用模型、epoll目录。 6. 多任务深入理解: * 并发与并行:CPU时间片...

    对象流(序列化)

    序列化是Java平台的标准特性,由java.io.Serializable接口提供支持。接下来,我们将深入探讨对象流和序列化的相关知识。 1. **序列化接口**: 任何Java类如果想要实现序列化,就需要实现`Serializable`接口。这个...

    JAVA基础知识课件 适合初学者

    ch7 IO流与文件读写 ch8-1 基于Swing的图形用户界面 ch8-2 基于Swing的图形用户界面 ch9 Applet与图形处理 ch10 多线程 ch11 JDBC与数据库访问 ch12 Java网络编程 看完受益匪浅,对JAVA有新认识,大学生期末考试可90...

    purescript-streams:组合式流IO库(未完成)

    在深入理解 `purescript-streams` 之前,我们需要对PureScript有一些基本认识。PureScript具有严格的类型系统,支持模式匹配、类型类和高阶函数,这些都是函数式编程的核心特性。此外,PureScript强调代码的纯性,即...

    JIT精益生产实务-流线化生产培训课件.pptx

    实施流线化生产需要全员参与,逐步推进,从思想层面认识到JIT的价值,通过不断改进和优化,最终迈向无人化生产,实现高效、灵活的生产模式。 总结来说,流线化生产是通过优化生产布局、同步化生产速度、多能化员工...

    1-IO输出-点亮1个LED灯方法1_单片机_

    本教程将详细介绍如何通过单片机实现基本的IO输出功能,即点亮一个LED灯。这一操作是所有单片机编程学习者的入门实践,有助于理解单片机的工作原理和编程流程。 首先,我们需要了解单片机的I/O端口。单片机的I/O...

Global site tag (gtag.js) - Google Analytics