1.概念
IO即Input/Output,输入和输出。IO在Java中分为输入流和输出流,数据输入到计算机内部的为输入流,输出到外部存储的为输出流。而根据数据的处理方式又分为字节流和字符流,
InpitStream/Reader: 前者字节输入流,后者字符输入流
OutputStream/Writer:前者字节输出流,后者字符输出流
BufferedInputStream: 字节缓冲输入流,读取文件数据时先将读取的字节存放到缓存区,并从内部缓冲区单独读取字节,这样大幅减少了IO次数,提高了读取效率
BufferedOutputStream:字节缓冲输出流,将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。这样大幅减少了 IO 次数,提高了读取效率
BufferedReader: 字符缓冲输入流
BufferedWriter:字符缓冲输出流
2.设计模式
2.1 装饰器模式
2.1.1 概念
装饰器模式是一种结构型设计模式,它允许你动态地为对象添加新的行为或责任,同时保持原有类的结构。在IO流设计中,装饰器模式允许我们以灵活的方式组合不同的流,实现复杂的数据处理功能。
2.1.2 优点
- 灵活性:装饰器模式允许我们动态地添加或修改对象的职责,提高了系统的灵活性。
- 复用性:装饰器模式可以复用现有的组件,通过组合不同的装饰器来实现新的功能。
- 扩展性:在不修改现有代码的情况下,我们可以通过添加新的装饰器来扩展系统的功
2.2 工厂模式
2.2.1 概念
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2.2.2 类型
- 简单工厂模式(Simple Factory Pattern):
- 这个模式本身很简单而且非常直观,可以根据参数的不同返回不同类的实例。
- 它专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
- 工厂方法模式(Factory Method Pattern):
- 工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。
- 这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
- 抽象工厂模式(Abstract Factory Pattern):
- 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 客户端(应用层)不直接创建实例,而是通过接口向工厂请求一个对象,由工厂决定应该实例化哪一个类。
2.2.3 优点
-
解耦:客户端和具体实现类的解耦,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现隐藏起来。
-
扩展性高:在增加产品类的情况下,只需要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。例如,对于新加入的产品类,只需要对应地增加一个具体的工厂类就可以拥抱变化了。
-
封装性良好:客户端根本不需要知道所创建对象的类名,只需要知道对应的工厂就可以。
2.3 适配器模式
2.3.1 概念
适配器模式(Adapter Pattern),又称变压器模式或包装器(Wrapper),是一种结构型设计模式。其主要功能是将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够协同工作。
2.3.2 优点
- 复用且不修改类:不改变现有类的基础上,提高类的复用性,让现有类与目标类接口匹配。
- 降低耦合:目标类和现有类解除耦合,降低了系统的耦合性,易于扩展维护。
- 符合开闭原则:用户调用适配器接口,只与适配器类进行交互,如果需要修改扩展,只需要修改适配器类即可。
2.4观察者模式
2.4.1 概念
观察者模式通常用于实现一种一对多的依赖关系,使得当一个对象(主题或可观察者)改变其状态时,所有依赖于它的对象(观察者)都会得到通知并自动更新。
3.IO模型
IO 模型一共有 5 种:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。
3.1 常见3种IO模型
3.1.1 BIO
属于同步阻塞IO模型,应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间,在客户端连接数量不多的情况下,问题不大,但是数量一旦多起来了,就会影响性能
3.1.2 NIO
NIO 弥补了同步阻塞 I/O 的不足,它在标准 Java 代码中提供了非阻塞、面向缓冲、基于通道的 I/O,可以使用少量的线程来处理多个连接,大大提高了 I/O 效率和并发。
NIO 主要包括以下三个核心组件:
- Buffer(缓冲区):NIO 读写数据都是通过缓冲区进行操作的。读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。
- Channel(通道):Channel 是一个双向的、可读可写的数据传输通道,NIO 通过 Channel 来实现数据的输入输出。通道是一个抽象的概念,它可以代表文件、套接字或者其他数据源之间的连接。
- Selector(选择器):允许一个线程处理多个 Channel,基于事件驱动的 I/O 多路复用模型。所有的 Channel 都可以注册到 Selector 上,由 Selector 来分配线程来处理事件。
3.1.3 AIO
AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型。
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。