Java IO流

news/2024/5/24 10:39:44/

Java IO流

IO就是Intput和Output也就是输入输出,将数据输入到计算机内存的过程叫做输入,从内存读取出来的数据叫做输出。Java的IO流总共有40多个类,他们都是由下个4个抽象类派生出来的,InputStream和Read和OutputStream和Writer。

IO里使用的设计模式

装饰器模式

​ 装饰器(Decorator)模式可以字啊不改原有对象的情况下进行扩展,装饰器模式是通过组合来替换继承来扩展原始类的功能,在继承非常法则的场景下这个设计模式是非常实用的,在IO流中他们的继承关系就是非常的复杂,所有在IO流中使用了装饰器模式。

​ FilterInputStream和FilterOutputStream对应输入流和对应输出流都是我们装饰器模式的核心,分别用于增强自累InputStream和OutputStream子类对象的功能。

适配器模式

适配器模式Adapter pattern模式主要用于接口互相不兼容的类的协调工作,在适配器模式中,**被适配的对象叫做适配者(Adaptee),作用于适配者的对象叫做适配器(Adapter)**类适配器用继承的关系实现,对象适配器使用组合关系来实现。

在我们IO流中字符流和字节流的接口不同,他们之间的协调工作就是使用适配器来实现,准确点来说是对象适配器,通过适配器我们可以将一个字节流对象适配成一个字符流对象,这样我们就可以通过字节流对象来读取和写入了。

我们的inputstream和outputstream的子类就是适配者,Inputstreamreader和outputstreamwriter就是适配者。

工厂模式

在我们的NIO中就大量使用了工厂模式,比如我们的newInputStream方法用于创建INputStream对象,就是用了静态工厂。

观察者模式

NIO中的文件目录舰艇就是用了观察者模式,**NIO中的文件目录监听服务基于watchservice接口和watchble接口。**WatchService属于观察者,watchble属于被观察者。

BIO

BIO就是同步堵塞IO模型,当程序发起read调用后,会一直堵塞,知道内核吧数据拷贝到用户空间。如果我们并发特别高BIO就显然没有优势了

NIO

NIO就是我们的同步非堵塞IO模型,当我们application发起read调用,等待数据从内核空间拷贝到用户空间这段时间里,县城依然是堵塞的,知道内核数据拷贝到用户空间,

我们的BIO和NIO比较,我们的NIO通过轮训操作避免了一只堵塞。当然这么做是十分消耗CPU的这时候我们的多路复用IO就来了。IO多路复用模型中,县城首先发起select调用,首先询问数据是否准备就绪,如果内核吧数据准备好了,用户就发起read调用(数据从内核空间读取到用户空间)这段区间还是堵塞的。

IO多路复用模型系统调用有select 还有epoll,

select是内核提供系统的调用他支持一次查询多个系统调用的可用状态。

epoll调用是linux2.6他相当于select的增强版本,对selcet进行了io执行效率优化

IO多路复用模型就是通过减少无效的系统调用减少了对CPU资源的消耗,在Java中的NIO中有一个非常重要的选择器概念,也被称为多路复用器,通过它,一个线程可以管理多个客户端的链接,当客户端数据到了之后才为他服务。

简单来说NIO就是通过我们选择器监听多个通道,非堵塞,处理完成后就返回。


http://www.ppmy.cn/news/47288.html

相关文章

网络拥塞控制,对越远的流量越宽容

考虑下面的网络传输场景: ​ S1,S2,S3,S4 向 D 方向发送,R4 发生拥塞。R4 必须丢弃一些数据进行疏导反馈拥塞信号,否则谁也过不去。 优先丢掉离得最近的 S4 的数据,其次依次丢 S3,S2…

ChatGPT会如何改变制造业?

来源 | Smart Industry Edgenesis编译 ChatGPT最新版本的发布成为热门头条。OpenAI表示该版本的ChatGPT能够在多个专业测试中达到“人类水平”的表现,例如司法考试和SAT考试。不过,在工业领域中,ChatGPT能够发挥怎样的作用呢?Sma…

计算广告(十七)

多渠道组合路径效率评价 ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 分析背景: 电商归因分析通常以 last_click 为基准,将成交转化归功于用户完成转化前的最近一个广告系列。然而,在此之前&a…

HTTP的那些事儿

超文本传输协议(Hyper Text Transfer Protocol,HTTP),它是在计算机世界中的两个点之间传递文本,图片,多媒体等超文本文件的协议。HTTP处在数据链路层,网络层,传输层,应用…

java 资料地址汇总

1 SpringBoot - 使用 Assert 校验让业务代码更简洁 SpringBoot - 使用 Assert 校验让业务代码更简洁 2 MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定,真香! MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定&#…

中小企业面临怎样的数字化转型局面

当前,我国经济长期向好的基本面没有改变,但承受着“需求收缩、供给冲击、预期减弱”的三重压力,中小企业的数字化转型之路较之以往更加艰难、曲折。为帮助中小企业纾困解难、平稳渡过危机,需进一步优化政策“组合拳”,…

CMake

CMake定义 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特性,类似UNIX下的automake。只是 CMake 的组态档取名为 C…

背包问题——01背包|完全背包

目录 前言&背包问题的历史 01背包 1、题目 2、暴力解01背包 Ⅰ、代码 3、动态规划解01背包 Ⅰ、二维dp数组解01背包 1)dp数组的含义 2)递推公式 3)dp数组的初始化 4)遍历顺序的讨论 5、代码 Ⅱ、一维数组解01背包 1&…

[API]集合Collection常用方法集合遍历新循环泛型(三)

什么是集合: 集合和数组一样,可以保存一组数据,并且提供了操作数组元素的相关方法,使用用更加方便 集合框架中的相关接口: java.util.Collection接口:是所有集合的顶级接口,封装了所有集合所…

【理解 C++ 中的头文件和源文件的作用 】

include文件中定义 src文件中声明 头文件中应该只放变量和函数的声明,而不能放它们的定义。 在 C 中,头文件和源文件有着不同的作用。它们共同组成了 C 项目的基本结构。让我们逐个了解它们的作用。 头文件(.h 或 .hpp 文件)&a…

【从零开始学Skynet】实战篇《球球大作战》(十四):agent跨服务器版

至此,我们已完成了《球球大作战》的绝大部分功能,只剩下完 善agent ,让它和 scene 服务联动了。 1、多个模块 一般而言,代理服务会承载很多系统,比如邮件、成就等,此处涉及的代码较多,容易混 乱…

初中级测试工程师,软件测试面试题总结大全(功能/接口/自动化测试)你要的都有...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般软件测试的面…

程序员只能吃青春饭?3条晋升之路帮你摆脱程序员中年魔咒!

作为一个程序员 尤其是在这些中 不管是中国 还是美国的这些大的公司里边呢 往往呢 有大概两条这样的一个境界之路 根据你自己个人的这种能力兴趣 其实你可以进行自己的选择 科技大佬们其实往往呢也都是从 这个比较年轻的时候对吧 归国创业也好 还是自己出自于草根 然后一下子凝…

【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

基于Scrapy框架的图片管道实现图片抓取 前言 本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取,并以抓取 360 图片为例进行展示。 正文 1、Scrapy框架抓取图片原理 利用 Scrapy 框架提供的图片管道类 ImagesPipeline 抓取页面图片,在使用时需…

今天面了个字阿里拿38K出来的,真是纹身师闭眼,秀了我一脸啊

公司前段缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-20k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不提测…

【已解决】Field ‘id‘ doesn‘t have a default value 错误的解决办法

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Qt 项目A调用项目B方法(项目架构管理)

前言 项目开发中,如果项目比较大,大多采用多项目的方式,主要是为了方便代码管理,也更开发变得更加方便。操作如下: 注:我用的版本是Qt 5.12.3 一、建立项目目录 要求: 1、项目A为主&#xff…

Java之~ Aop自定义注解日志

大纲步骤: 一,创建需要记录的日志表,创建基础方法。(省略) 二,在需要加记录日志的方法上加Aop注解1,创建一个注解类,Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 这四个标签是为了创建对象 其实他们四个本质都一样,只不过另外三个是Component的别名,在不同层使用容易区分 首先需要加入aop依赖,如果你事先加入spring-context依赖…

JS数组去重的12种方法

一、利用ES6 Set去重(ES6中最常用) Set对象是ES6中新定义的数据结构,类似数组,它允许存储任何类型的唯一值,不管是原始值还是对象引用。 Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组 …