前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 中 IO 流分为几种?

Java 中 IO 流分为几种?

作者头像
崔笑颜
发布于 2020-06-08 08:38:15
发布于 2020-06-08 08:38:15
1.5K0
举报
  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流。 Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。
  1. InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  2. OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

既然有了字节流,为什么还要有字符流?

问题本质想问:不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?

回答:字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。

BIO,NIO,AIO 有什么区别?

  • BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
  • NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
  • AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
记一次内部分享——瞎扯淡
今天给大家分享的主题是《闲聊Docker》,大家的工作都比较忙,但是也要劳逸结合,所以“闲”是忙里偷闲,而“聊”是只动嘴不动手,整个分享过程中不会去动手实践,也不会去教大家如何build镜像,如何run容器,而只做纯粹的闲聊,我是一个“纯粹”的人。
没有故事的陈师傅
2022/09/15
3830
记一次内部分享——瞎扯淡
【K8S专栏】什么是云原生?
我相信大部分人都听过云原生,但是要你说出一个所以然,却不知道怎么开口,我也是一样。
没有故事的陈师傅
2022/09/15
1.3K0
【K8S专栏】什么是云原生?
【K8S专栏】什么是Kubernetes
在《Docker容器技术》章节就有简单介绍Kuberntes,它是谷歌开源的容器容器集群管理系统,是谷歌内部容器管理系统Borg的开源版本。
没有故事的陈师傅
2022/09/15
4390
【K8S专栏】什么是Kubernetes
四个月技术写作,我写了些什么?
按照大多数个人订阅号的优良传统,号主应该在跨年的前后作年终总结。然而,一来我反应比较迟钝,没跟上节奏,二来当时我正在写比较重要的系列,没时间分心,所以还是慢了半拍。
Python猫
2019/04/09
4380
我的2018,用一年的时间写一份年终总结!
不觉中,已经连续写了五年年终总结了(2013,2014,2015,2016,2017)。最初写总结是因为报名参加了CSDN“我的2013年”博客征文大赛,侥幸得到评委的抬爱,拿了特等奖。奖项只代表过去,更多是鞭策未来能否言行如一。
铭毅天下
2019/03/07
6260
我的2018,用一年的时间写一份年终总结!
服务器中毒了——菜是原罪
周五朋友生日,刚吃完饭准备唱歌,接到消息说业务支付失败,问题是银行前置机无法正常和银行建立连接。
没有故事的陈师傅
2022/09/15
9490
服务器中毒了——菜是原罪
如何才能不被Kubernetes按在地上摩擦?
Kubernetes虽然成为了标准,但是不同的运维在实施的时候,或者说不同的公司在使用的时候是千奇百怪的,我们也会经常在一些Kubernetes社区群里看到一些千奇百怪的问题,这些问题除了提升自身硬实力之外,也要树立一些做事的规范。这里从下面四个方面说一些个人的看法和见解,这些都是我自己在实际工作中运用的,说的不对的地方请指正。
没有故事的陈师傅
2021/09/09
2970
面了一些运维,发现3个共同点
最近因为一些原因,需要招一个运维人员,所以就筛选了很多简历,也面了很多人,我发现大家都有一些相同的问题。
没有故事的陈师傅
2023/08/09
3090
面了一些运维,发现3个共同点
【读书笔记】《漫画算法》:克服对算法的恐惧,从漫画开始
在上小学和初高中的时候,要我写读后感这种东西,我是非常厌恶的。无非就是老师布置的一个作业,还是那种无趣且磨人的工作。
蛮三刀酱
2020/06/20
4540
洋葱阅读法
在冥想的时候,我们什么都不用去关注,只关注自己的一呼一吸即可。尽管你思绪万千,但是一旦你意识到自己在乱想,你就把注意力再拉回到关注呼吸上来。像这样每天五分钟的简单练习,可以让你慢慢锻炼出专注力
yeedomliu
2022/04/28
7010
洋葱阅读法
讲道理,只要你是一个爱折腾的程序员,毕业找工作真的不需要再花钱培训!
标题*想吸引你进来参考下我的学习方式,或许能给你带来一些经验。当然不乏一些培训中也有超级优秀的开发人员。*
小傅哥
2020/05/01
6450
讲道理,只要你是一个爱折腾的程序员,毕业找工作真的不需要再花钱培训!
耗时两年,我终于出了一本电子书!
2018 年国庆节前,我开通了微信公众号“Python猫”,写下了“喵星来客”系列的第一篇文章。
Python猫
2020/10/23
6150
耗时两年,我终于出了一本电子书!
4个步骤,3种笔记,教你学会麦肯锡笔记思考法(1)
你好,朋友,好久不见,最近还好吗?有没有坚持阅读呢?我最近读了《麦肯锡笔记思考法》这本书,觉得很有价值,在此分享给大家,接下来我会写四篇文章分享一下我从这本书中学习到的知识,希望对你有所帮助。
leoay
2020/05/25
2.3K0
【K8S专栏】Kubernetes数据持久化管理
Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理。
没有故事的陈师傅
2022/09/15
1.3K0
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
很多次小伙伴问到学习方法,我也很想写这样的一篇文章来跟大家讨论下关于学习方法这件事情。
全栈程序员站长
2022/06/29
5050
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
从象棋到太极,领悟学习之道(前言)
不知道有多少人了解过维茨金,也不知道有多少人看过他写的书。先借鉴网上对维茨金的个人描述,让大家先有个了解。
韩东吉
2018/10/19
7600
感谢您!
另外,在文末给大家送一个福利,当然了肯定不是那种:“只要回复1024,立刻得到1个T的学习大礼包!”我从来没有下载过这种学习大礼包,那么多的资料一下子摆在面前,我的头就变大
IOT物联网小镇
2021/05/13
3230
感谢您!
🚀 从开发到集群:掌握Docker与Kubernetes自动化部署的完整指南
Hello,朋友们!如果你最近在学习或者使用现代软件开发技术,Docker和Kubernetes这两个词一定频频出现在你的视线中。是不是感觉有点熟悉又有点陌生?要理解这两者的魅力,咱们得从头开始慢慢拆解。今天,我就带大家完成一次从零到一的技术旅程:从构建一个简单的Java Web应用,到容器化,再到Kubernetes集群的部署,最后实现CI/CD自动化的全过程。
bug菌
2024/12/23
5220
🚀 从开发到集群:掌握Docker与Kubernetes自动化部署的完整指南
小白学MySQL要多久?我整理了10多个问题的答案
首先啰嗦下学习MySQL的一些背景:MySQL作为目前最为活跃热门的开源数据库之一,以低成本和简易操作的组合方案在互联网企业中被广泛采用而大放异彩。在炙手可热的BAT中,MySQL正被大量使用。显然,对于想在互联网行业大展手脚的数据库工程师和DBA们,熟练的MySQL技术无疑是一块很好的敲门砖。
jeanron100
2019/10/11
3.1K0
小白学MySQL要多久?我整理了10多个问题的答案
【K8S专栏】Kubernetes调度管理
在日常工作中,每个机场都有调度室,用来管理飞机应该从哪里降落,停在什么地方。在Kubernetes也有这样的调度器,主要作用就是将Pod安排到合适的节点上。
没有故事的陈师傅
2022/09/15
6710
【K8S专栏】Kubernetes调度管理
推荐阅读
相关推荐
记一次内部分享——瞎扯淡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档