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

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/661849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端基础入门:静态页面与动态页面的区别

什么是静态页面和动态页面? 通俗的来讲,静态页面是随着HTML代码的生成,页面的内容和显示效果就基本不会发生变化(除非修改页面代码),而动态页面,虽然同样页面代码不发生变化,但是其…

【错题集-编程题】小红取数(动态规划 - 01 背包 + 同余)

牛客对应题目链接&#xff1a;小红取数_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 这道题是不能用空间优化的。 同余原理 a % k x 和 b % k y <> (ab) % k 0 <> (xy) % k 0 状态表示 dp[i][j]&#xff1a;表示从前 i 个数中挑选&#xff0c;总和 %k 等于 j…

【class19】人工智能初步---语音识别(5)

【class19】 上节课&#xff0c;我们学习了&#xff1a;语音识别模型的结构和原理&#xff0c;同时调用创建好的AipSpeech客户端实现了语音转文字功能。 本节课&#xff0c;我们将初识字幕&#xff0c;学习这些知识点&#xff1a;1. srt字幕 2. 获取时间数据 …

OpenWrt 安装Quagga 支持ospf Bgp等动态路由协议 软路由实测 系列四

1 Quagga 是一个路由软件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的实现. 2 web 登录安装 #或者ssh登录安装 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登录 #重启服务 /etc/init.d/quagga restart #…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

一个生动的例子——通过ERC20接口访问Tether合约

生动的例子 USDT&#xff1a;符合ERC20标准的美元稳定币&#xff0c;Tether合约获得测试网上Tether合约地址通过自己写的ERC20接口访问这个合约 Tether合约地址&#xff1a;0xdAC17F958D2ee523a2206206994597C13D831ec7 IERC20.sol // SPDX-License-Identifier: GPL-3.0pra…

ARM-V9 RME(Realm Management Extension)系统架构之系统能力的内存隔离和保护

安全之安全(security)博客目录导读 目录 一、内存隔离和保护 1、颗粒PAS过滤Granular PAS filtering 2、Cache的一致性维护 2.1 物理别名点 Point of Physical Aliasing (PoPA) 2.2 加密点 3、内存(DRAM)保护 3.1 内存加密和完整性 3.2 DRAM scrubbing 本博客探讨 RME…

Django之rest_framework(九)

一、分页-PageNumberPagination类 REST framework提供了分页的支持 官网:Pagination - Django REST framework 1.1、全局设置 # settings.py REST_FRAMEWORK = {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.PageNumberPagination,PAGE_SIZE: 100 # 每页数目 }提示…

【YashanDB知识库】自动选举配置错误引发的一系列问题

问题现象 问题出现的步骤/操作&#xff1a; ● 配置自动选举&#xff0c;数据库备库手动发起switch over&#xff0c;命令会报错 ● 主、备库变为只读状态&#xff0c;数据库无法进行读写操作 ● shutdown immediate 停止数据库&#xff0c;此时发现数据库一直没有退出&…

leetCode-hot100-数组专题之子数组+二维数组

数组专题之子数组二维数组 子数组238.除自身以外数组的乘积560.和为K的子数组 二维数组48.旋转图像 子数组 数组的子数组问题是算法中常见的一类问题&#xff0c;通常涉及到数组的连续元素。在解决这类问题时&#xff0c;常用的方法有前缀和、滑动窗口、双指针&#xff0c;分治…

C++模拟实现stack和queue

1 stack 1.1概念 stl栈 1.2栈概念 1.3代码 2 queue 2.1概念 stl队列 2.2队列概念 2.3代码

java中,怎样用最简单方法实现写word文档

在跨平台环境中实现写word时&#xff0c;如果用现成的库&#xff0c;就会涉及跨平台兼容性问题&#xff0c;比如在安卓与java中实现写word的功能。还有一个问题就是&#xff0c;完全用程序生成word文档&#xff0c;工作量较大。所以采用了模板替换的方法。 docx文档本质就是一…

Thingsboard规则链:Calculate Delta节点详解

在物联网(IoT)应用中&#xff0c;对设备数据的实时分析和处理是优化运营、预测维护的关键。Thingsboard作为一款功能强大的物联网平台&#xff0c;其规则引擎提供了丰富的节点来处理和分析数据流。其中&#xff0c;Calculate Delta节点是一个重要的工具&#xff0c;用于计算连续…

数据源不同?奥威BI软件是这么做的

面对数据源不同的情况&#xff0c;BI&#xff08;商业智能&#xff09;软件如奥威BI软件通常通过一系列技术和方法来实现数据的整理。以下以奥威BI软件为例&#xff0c;详细解释其如何整理不同数据源的数据&#xff1a; 数据收集&#xff1a; 爬虫技术&#xff1a;奥威BI软件…

六面体大米装袋机在提升大米包装效率中的作用

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各行各业都在寻求创新与突破&#xff0c;以提升生产效率和降低成本。而在大米包装领域&#xff0c;六面体大米装袋机的出现&#xff0c;无疑为整个行业带来了革命性的变化。这种先进的机械设备不仅提高了大米的包装效率&a…

MySQL-innodb后台线程

文章目录 一、结构图二、后台线程①Master Thread②IO Thread③Purge Thread④Page Cleaner Thread 拓展知识 一、结构图 二、后台线程 InnoDB是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务 后台线程有&#xff1a; ①Master Thr…

文件上传巩固及流量分析

1.[GXYCTF2019]BabyUpload 1&#xff09;打开题目也是没有任何提示&#xff0c; 2&#xff09;进入环境&#xff0c;看到下面页面猜测是文件上传漏洞&#xff0c;下面开始传文件 3&#xff09;首先上传一句话木马 a.php&#xff0c;代码如下&#xff1a; 下面这个代码中并没有…

Mybatis多表查询

MyBatis-多表查询-一对一查询(方式一) 一个菜品对应一个分类 直接菜品记录category对象 菜品id写入Dish,后面的分类直接写入 Category类 封装,如果sql不能封装上,那么直接使用resultmap封装 使用resultType只能封装基本属性 所以要定义一个resultmap手动封装 使用标签 要…

整理三维空间内4点的209个结构

4点的209个结构按照旋转对称的关系可分成73组 如1&#xff0c;72&#xff0c;177为一组, z y x z y x 1 72 177 1 2 10 93 4 * 4 74 39 2 * 3 73 179 5 * 5 76 178 3 * 6 75 133 6 7 77 180 7 8 8 89 34 9 11 95 35 * 35 91 …

怎么藏族翻译中文在线翻译?更好地了解藏族文化

怎么藏族翻译中文在线翻译&#xff1f;着全球化的发展&#xff0c;语言交流的重要性日益凸显。藏族&#xff0c;作为中国的一个古老而神秘的民族&#xff0c;其语言对于很多人来说充满了神秘感。然而&#xff0c;在今天的数字化时代&#xff0c;我们有了更多的工具来打破语言壁…