IO流&Servlet&SpringMVC

IO流的特性(方向,单位,功能)

Input(Byte)Output(Byte)Input(Character)Output(Character)
BasicInputStreamOutputStreamReaderInputStreamReaderWriterOutputStreamWriter
ArraysByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
FilesFileInputStreamRandomAccessFileFileOutputStreamRandomAccessFileFileReaderFileWriter
PipesPipedInputStreamPipedOutputStreamPipedReaderPipedWriter
BufferingBufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
FilteringFilterInputStreamFilterOutputStreamFilterReaderFilterWriter
ParsingPushbackInputStreamStreamTokenizerPushbackReaderLineNumberReader
StringsStringReaderStringWriter
DataDataInputStreamDataOutputStream
Data - FormattedPrintStreamPrintWriter
ObjectsObjectInputStreamObjectOutputStream
UtilitiesSequenceInputStream

什么是 Stream 对象?

Stream是 java 程序和文件之间的逻辑连接。为了在持久性媒体中存储数据,应该有一种从 java 应用程序在物理上或逻辑上连接到持久性媒体的方法。流提供逻辑连接。因此,我们可以将流定义为“它是 java 程序和持久性媒体之间的连续数据流”

序列化及反序列化

序列化是将对象的状态转换为字节流的机制
反序列化是使用字节流在内存中重新创建实际 Java 对象的反向进程
此机制用于持久化对象

序列化的好处

  1. 保存/持久化对象的状态
  2. 在网络中传输对象

常用的IO流接口及类型(类名,功能)

  字符流的名称通常以 Reader/Writer 结尾,字节流的名称以 InputStream/OutputStream 结尾

字节流,继承于InputStream - OutputStream
字符流,继承于InputStreamReader - OutputStreamWriter

  1. 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
  2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以

  BufferedReader是一种过滤器(filter)(extends FilterReader)。过滤器用来将流的数据加以处理再输出。

  字符流将逐个字符读取文件。字符流能够读取16位字符(字节流读取8位字符)。字符流能够隐式地将8位数据转换为16位数据,反之亦然。字符流可以支持所有类型的字符集 ASCII、 Unicode、 UTF-8、 UTF-16等。但字节流仅适用于 ASCII 字符集。Java 平台使用 Unicode 约定存储字符值。字符流 i/o 自动将这种内部格式转换为本地字符集。
  除非使用二进制数据(如图像和声音文件) ,否则应该使用读取器和写入器以字符流读取和写入信息。

在字节流类层次结构的顶部,有两个抽象类: 用于面向字节的输入的 InputStream 和面向字节的输出操作的 OutputStream

字节流

类名功能
InputStream面向字节的输入流的顶级抽象类
ByteArrayInputStream此类的实例包含用于读取字节流的内部缓冲区
FilterInputStream此类的一个实例包含一些其他输入流,作为进一步操作的基本数据源
BufferedInputStream这使得实例使用缓冲区作为输入数据
DataInputStream该类的一个实例支持以独立于机器的方式从底层输入流读取基本 Java 类型
LineNumberInputStream此类的一个实例有助于跟踪输入流的当前行号
PushbackInputStream这提供了在读取一个数据字节后将其推回或“未读”的能力
FileInputStream此类的实例用于从文件系统中的文件获取输入字节
ObjectInputStream此类的一个实例用于在对象被 ObjectOutputSteam 序列化之后对其进行反序列化
PipedInputStream该类的一个实例为按 FIFO 方式工作的输入字节提供管道或缓冲区
SequenceInputStream此类的实例表示两个或多个按顺序读取的输入流的逻辑串联,一个接一个
OutputStream面向字节的输入流的顶级抽象类
ByteArrayOutputStream此类的实例包含用于写入字节流的内部缓冲区
FilterOutputStream此类的一个实例包含一些其他输出流,作为进一步操作的基本数据源
BufferedOutputStream这使得过滤输出流实例使用缓冲区输出数据
DataOutputStream此类的一个实例支持以独立于计算机的方式将基本 Java 类型写入基础输出流
PrintStream这就赋予了对象,能够方便地打印各种数据值的表示形式
FileOutputStream此类的实例用于输出将数据写入文件或文件描述符的流
ObjectOutputStream此类的一个实例用于序列化可以用以进行反序列化的对象
PipedOutputStream这个类的一个实例为输出字节提供了一个管道或缓冲区,该管道或缓冲区以 FIFO 方式工作

在字符流类层次结构的顶部,有两个抽象类: 面向字符输入的 Reader 和面向字符输出操作的 Writer

字符流

类名功能
Reader读取字符流的顶级抽象类
BufferedReader在从字符输入流读取文本时提供一个中间缓冲区,以提高效率
LineNumberReader使用保持行号跟踪的缓冲字符输入流
CharArrayReader实现可用作读取器的自动增加字符缓冲区
FilterReader此类的一个实例用于读取字符文件
PushbackReader这使字符能够在读取之后被推回到流中
InputStreamReader此类的一个实例提供了从字节流到字符流的桥接。字节使用指定的字符集被解码为字符
FileReader此类的一个实例用于读取字符文件
PipedReader使用管道进行字符输入流
StringReader来自源字符串的字符输出流读取器
Writer写入字符流的顶级抽象类
BufferedWriter在将文本写入字符输出流时提供中间缓冲区以提高效率
CharArrayWriter实现可用作写入器的自动增加字符缓冲区
FilterWriter抽象类,用于编写已筛选的字符流
OutputStreamWriter该类的一个实例提供了字符流和字节流之间的桥梁。使用指定的字符集将字符编码为字节
FileWriter此类的一个实例用于编写字符文件
PipedWriter使用管道进行字符输出流
PrintWriter将对象的格式化表示形式打印到测试输出流
StringWriter字符输出流在字符串缓冲区中收集,可用于构造字符串

延申

装饰器模式

装饰器设计模式允许我们动态地向对象添加功能和行为,而不影响同一类中其他现有对象的行为
装饰器设计模式允许我们在运行时向对象(而不是类)添加功能,并且我们可以根据需求和选择将这个定制的功能应用于单个对象

  • 装饰器模式允许用户在不改变现有对象结构的情况下向其添加新功能。因此,对原始类没有任何更改
  • 装饰器设计模式是一种结构化模式,它为现有类提供包装器
  • 装饰器设计模式使用带有组合的抽象类或接口来实现包装器
  • 装饰器设计模式创建装饰器类,这些类通过保持类方法的签名不变来包装原始类并提供额外的功能
  • 修饰符设计模式通常用于应用单一职责原则,因为我们将功能划分为具有独特关注领域的类
  • 装饰者设计模式在结构上类似于责任链模式

适配器模式

适配器模式充当两个不兼容接口之间的连接器,否则不能直接连接。适配器用新的接口封装现有的类,这样它就可以与客户机的接口兼容
使用此模式的主要动机是将现有接口转换为客户机期望的另一个接口。它通常是在应用程序设计好之后实现的

  • 适配器设计模式是一种结构化设计模式,它允许两个不相关/不常见的接口一起工作。换句话说,适配器模式使两个不兼容的接口兼容,而不更改它们的现有代码
  • 接口可能是不兼容的,但是内部功能应该符合需求
  • 适配器模式通常用于使现有类与其他类一起工作,而不用修改它们的源代码
  • 适配器模式使用单个类(适配器类)来连接独立或不兼容接口/类的功能
  • 适配器模式也称为包装器,这是与装饰器设计模式共享的另一种命名方式
  • 此模式将类(适配器)的(不兼容)接口转换为客户端需要的另一个接口(目标)
  • 适配器模式还允许类一起工作,否则,由于接口不兼容,类就不能工作

Socket&ServerSocket

ServerSocket
  创建一个 ServerSocket 类,同时在运行该语句的计算机的指定端口建立监听服务,例如: ServerSocket MyListener = new ServerSocket (600) ; 这里指定的提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务按端口号区分,不同的端口号提供不同的服务。为了在任何时候监视可能的 Client 请求,执行以下语句: Socket LinkSocket = MyListener.accept () ; 该语句调用 ServerSocket 对象的 accept ()方法。此方法的执行将使服务器端程序处于等待状态。程序将阻塞,直到从客户端捕获请求并返回一个 Socket 对象 link-Socket,该对象用于与客户端通信。在此之后,只要 Server 程序将数据读写到此 Socket 对象,它就可以将数据读写到远程 Client。当监视结束时,关闭 ServerSocket 对象: Mylistener.close();

Socket
  当 Client 程序需要从 Server 获取信息和其他服务时,它应该创建一个 Socket 对象: Socket MySocket = new Socket (“ ServerComputerName”,600) ; Socket 类的构造函数有两个参数。第一个参数是要连接到的 Server 计算机的主机地址,第二个参数是提供服务的 Server 计算机上的端口号。在成功建立 Socket 对象之后,您可以在 Client 和 Server 之间建立连接,并通过这个连接在两个端点之间传递数据。使用 Socket 类 getOutputStream ()和 getInputStream ()的方法分别获取将数据读取和写入 Socket 的输入/输出流,并最终将从 Server 读取的数据返回到 Server。当 Server 和 Client 之间的通信结束时,可以调用 Socket 类的 close ()方法来关闭 Socket 并终止连接。ServerSocket 通常只用于设置端口号和监听。真正的通信是在服务器套接字和客户端套接字之间。在接受 ServerSocket 之后,主动权被转移。

如果 Socket 代表客户端,ServerSocket 代表服务器端,为什么 Socket.read 从服务器端读取数据?
  创建 ServerSocket 是为了绑定到端口并侦听来自客户端的连接。因此,服务器只是等待一个会话,而不启动一个会话。
  创建 ClientSocket 以连接到监听服务器。客户端启动连接。
  示例: 以一个呼入呼叫中心为例。这些服务是服务器。他们不会主动打电话,而是等待客户的电话。一旦电话打进来,他们就可以进行双向对话。

BIO/NIO/AIO

Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装
程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了

同步&异步

当您同步执行某个任务时,您等待它完成后再转移到另一个任务
当您异步执行某项任务时,您可以在另一项任务完成之前移动到其他任务

阻塞&非阻塞

阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续
非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情

BIO
  同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成
NIO
  NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象
AIO
  AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

Servlet&SpringMVC

Springmvc 是一个用于构建 web 应用程序的 Java 框架。它遵循Model-View-Controller设计模式。它实现了一个核心spring框架的所有基本功能,比如控制反转,依赖注入
Model: 模型包含应用程序的数据。数据可以是单个对象,也可以是对象集合
View: 视图表示以特定格式提供的信息
Controller: 控制器包含应用程序的业务逻辑。在这里,使用@controller 注释将类标记为控制器
Front Controller: 在 springwebmvc 中,DispatcherServlet 类充当前端控制器。它负责管理 springmvc 应用程序的流程

在这里插入图片描述

所有传入的请求都被作为前端控制器工作的 DispatcherServlet 截获
DispatcherServlet 从 XML 文件获得处理程序映射的条目,并将请求转发给控制器
控制器返回一个 ModelAndView 对象
DispatcherServlet 检查 XML 文件中视图解析器的条目,并调用指定的视图组件

Spring MVC 框架的优势

  • 不同的角色 Spring MVC 分离每个角色,其中模型对象、控制器、命令对象、视图解析器、 DispatcherServlet、验证器等可以由专门的对象实现
  • 重量轻它使用轻量级 servlet 容器来开发和部署应用程序
  • 强大的配置它为框架和应用程序类提供了一个健壮的配置,包括跨上下文的方便引用,例如从 web 控制器到业务对象和验证器
  • 快速发展Spring MVC 有利于快速并行开发
  • 可重用业务代码它不是创建新对象,而是允许我们使用现有的业务对象
  • 易于测试在 Spring 中,通常我们创建 javabean 类,使您能够使用 setter 方法注入测试数据
  • 灵活的地图绘制它提供了可以轻松重定向页面的特定注释

Servlet 技术用于请求-响应范例的更通用的服务器端扩展
而 Spring 只是通过 HTTP 将其用于 Web 应用程序
Servlet 基于处理请求和响应的底层 API。像 SpringMVC 这样的 Web 框架被设计用来使构建处理 HTTP 请求和响应的 Web 应用程序变得更加容易。大多数 Java web 框架,包括 SpringMVC,都在后台使用 servlet
Web 框架被设计成使所有这些东西变得简单,使用 SpringMVC不必手动处理请求和响应,即使您仍然可以在需要时访问它们,servlet必须手动完成工作,而SpringMVC大多使用注释和将请求映射到控制器中的相应方法
这就相当于升级,从农民手动操作土地->机器操作土地

XML(良构,合法)

<Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
    <Age>23</Age>
</Person>

<Person FirstName="John" LastName="Doe" Age="23"></Person>

当排序不重要时,使用属性将值映射到唯一名称。否则,使用元素
值: 数字、字符串、日期等,但不是多属性对象
唯一名称: 元素上的每个属性名称都必须是唯一的。如果一个元素表示的事物可以有一个以上的 Foo 与之关联,那么 Foo 不应该是一个属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

week@eight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值