当前位置: 首页 > news >正文

JavaWeb基础(一)-IO操作

Java I/O工作机制:

注:简要笔记,示例代码可能较少,甚至没有。

1、Java 的 I/O 类库的基本架构。

​ Java 的 I/O 操作类在包 java.io 下,大概有将近80个类,这些类大概可以分为如下四组。

  • 基于字节操作的 I/O 接口:InputStream 和 OutputStream 。
  • 基于字符操作的 I/O 接口:Writer 和 Reader 。
  • 基于磁盘操作的 I/O 接口:File。
  • 基于网络操作的 I/O 接口:Socket。

1.1、基于字节的 I/O 操作接口

​ 基于字节的 I/O 操作接口输入和输出分别是:InputStream 和 OutputStream 。InputStream 的类层次如下:

在这里插入图片描述

​ 输入流根据数据类型和操作方式又被划分为若干个子类,每个子类分别处理不同操作类型。OutputStream 的类层次结构也类似,如下图:

在这里插入图片描述

1.2、基于字符的 I/O 操作接口

​ 下图是写字符的 I/O 操作接口涉及的类,Writer 类提供了一个抽象方法 write(char cbuf[],int off,int len)。

在这里插入图片描述

​ 读字符的操作接口也有类似的结构,如下图:

在这里插入图片描述

​ 读字符的操作接口是 int read(char cbuf[],int off,int len),。返回读到的n个字节数,不管是 Writer 还是 Reader 类,它们都只定义了读取或写入的数据字符的方式,也就是怎么写或读。

1.3、字节与字符的转化接口

​ 字符到字节需要转化,其中,读的转化过程如下:

在这里插入图片描述

​ InputStreamReader 类是字节到字符的转化桥梁,InputSream 到 Reader 的过程要指定编码字符集,否则将采用操作系统默认字符集,很可能会出现乱码问题。SteamDecoder 正是完成字节到字符的解码的实现类。类似如下代码读到一个文件时:

try {StringBuffer str = new StringBuffer();char[] buf = new char[1024];FileReader f = new FileReader("file");while (f.read(buf) > 0) {str.append(buf);}str.toString();}catch (IOException e){}

​ FileReader 类就是按照上面的工作方式读取文件的,FileReader 继承了 InputStramReader 类,实际上时读取文件流,然后通过 StreamDecoder 解码成 char ,只不过这里的编码字符集时默认字符集。

​ 写入也是类似的过程:

在这里插入图片描述

​ 通过 OutputStreamWriter 类完成字符到字节的编码过程,由 StreamEncoder 完成编码过程。

2、磁盘 I/O 工作机制:

2.1、几种访问文件的方式

  1. 标准访问文件方式。
  2. 直接 I/O 方式。
  3. 同步访问文件方式。
  4. 异步访问文件方式。
  5. 内存映射方式。

2.2、Java 访问磁盘文件

​ 当传入一个文件路径时,将会根据这个路径创建一个 File 对象来表示这个文件,然后根据这个 File 对象创建真正读取文件的操作对象,这时将会真正创建一个关联真实存在的磁盘文件的文件描述符 FileDescriptor,通过这个对象可以直接控制这个磁盘文件,。

在这里插入图片描述

2.3、Java 序列化技术

​ Java 序列化就是将一个对象转化为一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。需要持久化,对象必须继承 java.io.Serializable 接口。反序列化则是相反的过程,将这个字节数组再重新构造成对象。我们知道反序列化时,必须有原始类作为模板,才能将这个对象还原,从这个过程我们可以猜测,序列化的数据并不像 class 文件那样保存类的完整的结构信息。下面是一个简单的序列化的代码:

public class Serialize implements Serializable {private static final long serialVersionUID = - 6849794470754660011L;public int num = 1390;public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("d:/serialize.dat");ObjectOutputStream oos = new ObjectOutputStream(fos);Serialize serialize = new Serialize();oos.writeObject(serialize);oos.flush();oos.close();} catch (IOException e) {e.printStackTrace();}}
}

​ 序列化的文件二进制字节数据如下:

在这里插入图片描述

  1. 第一部分是反序列化文件头。

    在这里插入图片描述

  2. 第二部分是要反序列化的类的描述,在这里是 Serialize 类。

    在这里插入图片描述

  3. 第三部分是对象中各个属性项的描述

    在这里插入图片描述

  4. 第四部分输出该对象的父类信息描述,这里没有父类,如果有,数据格式与第二部分一样。

    在这里插入图片描述

  5. 第五部分输出对象的属性项的实际值,如果属性项是一个对象,那么这里还将序列化这个对象,规则和第二部分一样。

    在这里插入图片描述

http://www.lryc.cn/news/358153.html

相关文章:

  • 拼多多(PDD)社招一面原题
  • 类中使用QtConcurrent::run
  • 基于深度学习的中文情感分析系统python flask
  • Mysql联合索引
  • Linux基础指令用户管理003
  • java图书电子商务网站的设计与实现源码(springboot+vue+mysql)
  • 全球首个多语种手语视频生成模型诞生:SignLLM
  • 初学C语言100题:经典例题节选(源码分享)
  • C++设计模式之策略模式、迭代器模式、适配器模式、工厂模式、超级工厂模式、享元模式、代理模式
  • 18 js时间对象
  • 安卓赤拳配音v1.0.2Ai配音神器+百位主播音色
  • 前端面试题日常练-day40 【面试题】
  • UG NX二次开发(C#)-UFun函数-利用UFPart.Export导出模型中的对象并创建一个新的part
  • SFOS2:组件介绍
  • 交换机的三层交换技术
  • 探秘URL的奥义:JavaScript中轻松获取页面参数值的N种姿势【含代码示例】
  • VSCode小技巧,忽略不想格式化的代码行
  • 揭秘网络编程:同步与异步IO模型的实战演练
  • 在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style
  • 民国漫画杂志《时代漫画》第32期.PDF
  • RTKLIB学习--前向滤波
  • 利用C++与Python调用千帆免费大模型,构建个性化AI对话系统
  • VTK9.2.0+QT5.14.0绘制三维显示背景
  • Vue.js2+Cesium1.103.0 十六、多模型轨迹运动
  • Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计
  • 【C++】---二叉搜索树
  • FastAPI - 依赖注入3
  • 【网络运维的重要性】
  • YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】
  • 自用网站合集