09 Java 的 IO

IO种类

从数据传输方式可以将IO分为字节流和字符流:

  • 字节流:InputStream输入流,OutputStream输出流
  • 字符流:Reader输入流,Writer输出流
  • 如何选择:对于频繁处理字符串的情况,选择字符流会好一些,因为字符流具备缓冲区,提高了性能。缓冲区是一块特殊的内存区域,通过将数据缓存在缓冲区,之后直接从中读写,可以显著提高性能,字符流的操作都是在缓冲区进行的。字节流的操作不会经过缓冲区,而是直接操作文本本身。
BIO
  • 同步阻塞式IO模型: 服务端的线程会一直阻塞等待客户端发起请求,如果客户端一直不发起,那服务器端的线程会一直存在。
  • 弹性伸缩能力差: 每个客户端都会对应一个线程,对于上千万客户端的接入,会难以承受。
  • 多线程耗费资源: 线程的创建、销毁和阻塞等待,都会耗费CPU资源。
NIO
  • 同步非阻塞式IO模型: 服务器端提供一个单线程的 Selector 来同一管理所有客户端接入的 socket 连接,并负责监听每个客户端所关心的事件。
  • 弹性伸缩能力强: 因为服务端不再是多个线程来处理,而是一个线程来处理所有请求。
  • 单线程节约资源
Java IO 和 NIO 的区别
  • IO 面向流,NIO 面向缓冲区: IO 面向流是指每次从流中读取一个或多个字节,它们没有被缓存在任何地方,而且不能前后移动流中的数据。NIO 面向缓冲区是指将读取到的数据放到一个稍后处理的缓冲区,数据可以在缓冲区中前后移动,增加了灵活性。
  • IO 是阻塞的,NIO 是非阻塞的
  • NIO 中提供了一个单线程的 Selector 来管理多个输入通道。
NIO 核心:
  • Channel(通道):双向性,非阻塞性,操作唯一性(只能通过 buffer 操作)。实现方式由 UDP 类的 DatagramChannel , 和 TCP 类的 ServerSocketChannel / SocketChannel 。
  • Buffer(缓冲区):读写 Channel 中的数据,本质是一块内存区域。
  • Selector(多路复用器)
NIO 编程实现步骤
  1. 创建 Selector。
  2. 创建 ServerSocketChannel,并绑定监听端口。
  3. 将 Channel 设置为非阻塞模式。
  4. 将 Channel 注册到 Selector 上,监听连接事件。
  5. 循环调用 Selector 的 select 方法,检测就绪情况。
  6. 调用 selectedKeys 方法获取就绪 Channel 集合。
  7. 判断就绪事件种类,调用业务处理方法。
  8. 根据业务需要,决定是否再次注册监听事件,重复执行第三步操作。
阻塞非阻塞、同步异步

阻塞:发起请求后,调用者会一直等待请求结果返回,此时线程被挂起,无法从事其他任务。
非阻塞:发起请求后,调用者不用等着结果返回,可以先去处理其他任务。

同步:发起调用后,需要等待处理结果才能返回。
异步:发起调用后,不需要等待处理结果,被调用者可以通过回调机制来通知调用者它的返回结果。

为什么分为字节流和字符流?
  • 字符流是由Java虚拟机将字节转换得到的,这个过程是比较耗时的,而且容易出现乱码问题,所以IO直接提供了操作字符的接口。
  • 编码就是把字符转换为字节,而解码是把字节重新组合成字符。
  • InputStreamReader 实现从字节流解码成字符流;
  • OutputStreamWriter 实现字符流编码成为字节流。
java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

Java 中的流分为两种,一种是字节流,另一种是字符流,每种流都包括输入和输出,所以一共四个:InputStream,OutputStream,InputStreamReader,OutputStreamWriter。

字节流和字符流的区别:

  1. 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
  2. 字节流提供了处理任何类型的 IO 操作的功能,但它不能直接处理 Unicode 字符,而字符流就可以。
NIO(与IO相比主要是非阻塞、面向块而不是面向流)
  • NIO意思是新的输入/输出库,也可以理解成 non-blocking IO ,同步非阻塞的IO模型。
  • IO和NIO主要的区别是,IO以流的方式处理数据,NIO以块的方式处理数据。
  • NIO 实现了 IO 多路复用中的 Reactor 模型,一个线程 Thread 使用一个选择器 Selector 通过轮询的方式去监听多个通道 Channel 上的事件,从而让一个线程就可以处理多个事件。通过配置监听的通道 Channel 为非阻塞,那么当 Channel 上的 IO 事件还未到达时,就不会进入阻塞状态一直等待,而是继续轮询其它 Channel,找到 IO 事件已经到达的 Channel 执行。
  • 因为创建和切换线程的开销很大,因此NIO使用一个线程来处理多个事件,对于 IO 密集型的应用具有很好的性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值