目录

三.MySQL

3.1 关系型和非关系型数据库的区别

关系型数据库

  • 使用表结构,格式一致;
  • SQL语言通用,可用于复杂查询;
  • 读写性能比较差,尤其是海量数据的高效率读写;
  • 固定的表结构,灵活度稍欠;
  • 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库

格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。

2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;

3、高扩展性;

4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

1、不提供sql支持,学习和使用成本较高;

2、无事务处理;

3、数据结构相对复杂,复杂查询方面稍欠。

3.2 登录数据库的方式,如何远程登录

  1. 编辑 MySQL config 文件
  2. 配置防火墙允许远程连接
  3. 允许 root 远程登录
  4. 连接到远程 MySQL 服务器
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
mysql> UPDATE mysql.user SET host='%' WHERE user='root';

3.3 MySQL的服务结构,当客户端发起请求后,处理过程

3.4 如何设置或者重置MySQL密码

use mysql;
UPDATE user SET authentication_string=PASSWORD("root") WHERE User="root";
flush privileges;

3.5 DDL,DML,DQL,DCL等SQL语句的写法

DDL数据定义语句

#库部分
create database db02 charset utf8;
# 创建数据库的时候添加属性
show create database db01;
# 查看建库语句
drop database db02;
# 删除数据库db02
alter database db01 charset utf8;
#修改定义库
#表部分
create table student(
sid int '学号',
sname varchar(20) not null comment '学生姓名',
sage tinyint unsigned not null comment '年龄',
sgender enum('m','f') not null default 'm' comment '学生性别',
cometime datetime not null comment '入学时间'
)charset utf8 engine innodb;
#建表语句实例
desc student;
# 查看表中列的定义信息
drop table student;
#删表
alter table student rename stu;
# 修改表名
alter table stu add age int;
# 添加列和列数据类型的定义
alter table stu add test varchar(20),add qq int;
# 添加多个列
alter table stu add classid varchar(20) first;
# 指定位置进行添加列(表首)
alter table stu add phone2 int after sid;
# 指定位置进行添加列(指定列)
alter table stu drop qq;
# 删除指定的列及定义
alter table stu modify sid varchar(20);
# 修改列及定义(列属性)
alter table stu change phone telphone int();
# 修改列及定义(列名及属性)

DCL数据控制语言(用户权限)

grant all on *.* to root@'192.168.175.%' identified by '123456';
# 授予root@'192.168.175.%'用户所有权限(非超级管理员)
revoke select on *.* from root@'192.168.175.%';
# 收回select权限
show grants for root@'192.168.175.%';
# 查看权限

DML数据操作语言

insert into stu valus('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);

insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456),
('linux02',2,NOW(),'zhangsi',21,'f',NOW(),111,1234567);
# 插入多条数据 update student set sgender='f' where sid=1;
update mysql.user set password=PASSWORD('123456') where user='root' and host='localhost'; delete from student where sid=3; truncate table student;
# DDL清空表中的内容 alter table student add status enum('1','0') default 1;
# 额外添加一个状态列
update student set status='0' where sid=1;
# 使用update
select * from student where status=1;
# 应用查询存在的数据

DQL数据查询

了解select的高级用法(不多简述)

3.6 什么是索引,索引的作用

特殊的数据库结构

加快数据库表中数据的检索速度,用于确保数据的唯一性。

3.7 索引的种类

  • 主键索引
  • 普通索引
  • 唯一索引
  • 全文索引
  • 前缀索引
  • 组合索引

3.8 b树和b+树的区别

B树的每个节点都存储关键字和数据,而B+树只有叶子节点存储数据,内部节点仅存储关键字和指向子节点的指针

B+树因其优越的范围查询性能和索引空间利用率而被广泛用作默认的索引结构

3.9 什么情况下会导致索引失效

  1. 没有查询条件,或者查询条件没有建立索引。
  2. 在查询条件上没有使用引导列。
  3. 查询的数量是大表的大部分,应该是30%以上。
  4. 索引本身失效。

3.10 MySQL的explain

2024 年 8月 随笔档案 - guixiang - 博客园 (cnblogs.com)

3.11 什么是事务,事务的作用

事务 是一组操作,把所有的操作 作为一个整体一起向系统提交 或 撤销操作请求,即这些操作要么同时成功,要么同时失败。

3.12 事务的ACID分别怎么体现

Atomic(原子性)

  • 所有语句作为一个单元全部成功执行或全部取消。

Consistent(一致性)

  • 如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。

  • 在事务内看到的数据状态都是一样的。

Isolated(隔离性)

  • 事务之间不相互影响。

Durable(持久性)

  • 事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。
  • 软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。

3.13 事务的隔离级别

未提交读(read uncommited)

A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;

已提交读(read commited)

A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;---不可重复读

可重复读(repeated read)

A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;

mysql默认模式

3.14 什么是脏读,幻读,不可重复读

脏读

指一个线程中的事务读取到了另外一个线程中未提交的数据。

不可重复读

指一个线程中的事务读取到了另外一个线程中提交的update的数据。

幻读

指一个线程中的事务读取到了另外一个线程中提交的insert的数据。莫名情况下数据增加或减少(出现于可重复读)

3.15 事务的锁有哪些,怎么用

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

通过查询条件对某一行进行加锁,commit后解锁

//读锁(共享锁)

SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;

//写锁(排他锁)

SELECT * FROM table_name WHERE ... FOR UPDATE;

当我们进行增删改的时候Innodb是默认给对应行自动加上了写锁的,select查询不会加锁。

在行锁中,写锁和读锁都是其他会话只能查看无法修改该行数据,自己可以修改,但是我们给某一行加了读锁后,其他会话可以给这一行加读锁,不能加写锁。当我们给某一行加了写锁后,其他会话不能给该行加锁

3.16 悲观锁和乐观锁的区别

悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务;

乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据;

3.17 事务发生redo和undo的区别和过程

区别

Redo(重做) Undo(撤销)
用来记录数据页的物理修改,确保事务提交后数据的一致性,并在系统崩溃时能够恢复数据到提交状态。 用来记录事务中数据修改前的状态,以便在事务失败或需要回滚时,能够撤销事务所做的修改,恢复数据到修改前的状态。

Redo过程

  1. 数据修改前:在事务对数据库进行修改之前,InnoDB存储引擎会将修改操作记录到redo log buffer(内存中的日志缓冲)中。
  2. 数据修改:随后,对数据库中的数据进行实际的修改操作。
  3. 日志写入:当事务提交时,InnoDB会将redo log buffer中的日志写入到磁盘上的redo log file中,确保即使在系统崩溃的情况下,也能通过redo log恢复数据。
  4. 恢复数据:在系统崩溃或需要恢复数据时,可以通过redo log中的记录,将数据库恢复到事务提交时的状态。

Undo过程

  1. 数据修改前:在事务对数据库进行修改之前,InnoDB存储引擎会生成undo log,记录数据修改前的状态。
  2. 数据修改:对数据库中的数据进行修改。
  3. 事务提交或回滚:
    • 如果事务成功提交,undo log可能会被清理(根据具体的undo日志保留策略)。
    • 如果事务失败或执行ROLLBACK命令,InnoDB会根据undo log中的记录,将数据库中的数据恢复到修改前的状态。
  4. 读一致性:在并发事务中,undo log还用于实现读一致性,即确保读操作能够读取到事务开始前的数据状态。

3.18 在事务未提交的情况下,数据库服务器重启,会发生什么

​ 当系统提交了数据库DML指令,但未执行commit,系统宕机了。此时,数据库的数据不会改变,数据库连接会被清除,数据库事务也会被清除,也不会锁定数据

3.19 什么是MySQL的存储引擎,常见的存储引擎有哪些,innodb和myisam存储引擎的区别

MySQL数据库管理系统中负责存储和检索数据的组件,它们可以影响数据的存储方式、事务支持、并发性能等方面1MySQL中常见的存储引擎有MyISAM、InnoDB、Memory、Archive等23其中,InnoDB是MySQL的默认存储引擎,它提供了强大的事务处理、行级锁定和外键约束功能4MyISAM则不支持事务、行级锁和外键约束的功能

3.20 客户的数据库是myisam如何切换到innodb(大致步骤)

​ 如使用wp_comments表格。只需运行ALTER命令即可将其转换为InnoDB存储引擎。注意:我们始终建议在对MySQL数据库运行任何操作之前对其进行备份。

ALTER TABLE wp_comments ENGINE=InnoDB;

3.21 MySQL的日志都有哪些

  1. 重做日志(redo log)
  2. 回滚日志(undo log)
  3. 二进制日志(binlog)
  4. 错误日志(errorlog)
  5. 慢查询日志(slow query log)
  6. 一般查询日志(general log)

比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)

3.22 什么是二进制日志binlog,它的作用是什么

是一种记录数据库中发生的更改的日志文件。 它记录了数据以及数据库结构的更改

它可以

  • 有数据库搭建开始所有的二进制日志,可以把数据恢复到任意时刻
  • 数据的备份恢复
  • 数据的复制

3.23 二进制日志中row模式和statement模式的优缺点

  • statement语句模式

    • 优点:简单明了,容易被看懂,就是sql语句,记录时不需要太多的磁盘空间
    • 缺点:记录不够严谨
  • row行模式
    • 优点:记录更加严谨
    • 缺点:有可能会需要更多的磁盘空间,不太容易被读懂

3.24 慢查询日志分析(mysqldumpslow)

​ 将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件,通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的

$PATH/mysqldumpslow -s c -t 10 /application/mysql/data/slow.log
#输出记录次数最多的10条SQL语句

[!TIP]

/application/mysql/data/slow.log 是慢查询日志路径

3.25 MySQL的备份和恢复相关知识

#数据库备份
mysqldump -u root -p wordpress > wordpress_database.sql
#数据库还原
mysql > source /backup/mysqldump/wordpress_database.sql

3.26 MySQL服务损坏,且没有备份的情况下,数据库服务如何恢复

在MySQL服务损坏且没有备份的情况下,数据库服务的恢复是一项具有挑战性的任务。尽管无法完全保证恢复所有丢失的数据,但以下是一些可能的恢复步骤和策略:

1. 评估损坏程度

  • 检查日志文件:首先,检查MySQL的错误日志和其他相关日志文件,以了解服务损坏的具体原因和可能的错误信息。
  • 检查数据文件:检查MySQL的数据文件(通常位于/var/lib/mysql目录下),查看是否有明显的损坏迹象,如文件缺失、损坏或大小异常。

2. 尝试自动恢复

  • InnoDB崩溃恢复:如果MySQL使用的是InnoDB存储引擎,并且服务是因为崩溃而停止的,InnoDB会在MySQL服务重启时自动尝试恢复数据库到最近的一致性状态。这通常涉及回滚未提交的事务并应用重做日志中的更改。

3. 使用二进制日志恢复

  • 查找二进制日志:MySQL的二进制日志(Binary Log)记录了数据库的所有更新操作,包括插入、更新和删除等。检查/var/lib/mysql目录下是否存在二进制日志文件(通常以mysql-bin.开头)。
  • 分析日志:使用mysqlbinlog工具分析二进制日志文件,找出在损坏发生前执行的最后一个完整事务。
  • 恢复数据:根据分析的结果,可以尝试将二进制日志中的SQL语句导出到一个文件中,并使用mysql命令将这些语句应用到新的或修复后的数据库中。

4. 使用第三方数据恢复工具

5. 寻求专业人士帮助

6. 预防措施

  • 定期备份
  • 加强数据库的监控和日志记录

注意事项

  • 在进行任何恢复操作之前,请确保已经停止了MySQL服务,以避免在恢复过程中对数据造成进一步的损坏。
  • 恢复后的数据可能需要进行验证和测试,以确保数据的完整性和准确性。

3.27 MySQL主从架构原理

​ 该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。即使事务中的语句都是交叉执行的,在事件写入二进制日志完成后,master通知存储引擎提交事务。

​ 下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

​ SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

3.28 MySQL主主架构原理

它包含两个主数据库(Master),每个主数据库都可以处理读写请求,并且互为主备。

基本原理:

  • 双向复制:在两个主服务器(Master1和Master2)之间实现双向的数据复制。每个主服务器都将其更改记录到二进制日志(binary log)中,并且每个主服务器都配置为另一个主服务器的从服务器,从而从对方的二进制日志中读取更改并应用到自己的数据库中。
  • 数据一致性:通过持续的双向复制,两个主服务器的数据保持高度一致。这种一致性是异步的,但可以通过配置半同步复制来减少数据延迟和提高数据安全性。
  • 故障转移:在主主架构中,如果其中一个主服务器发生故障,另一个主服务器可以立即接管服务,无需进行复杂的故障转移操作。这有助于实现高可用性和业务连续性。

3.29 MySQL双主架构一致性的问题

一、数据同步的时间差

  • 异步复制
  • 同步延迟

二、并发写操作的数据冲突

  • 主键冲突:在双主架构中,如果两个主服务器同时尝试插入具有相同主键的记录,那么由于复制的时间差,这些插入操作可能会在各自的服务器上成功,但在同步到对方服务器时发生冲突。
  • 数据覆盖:如果两个主服务器同时更新同一条记录的不同字段,那么由于复制的顺序和时机问题,后一个更新可能会覆盖前一个更新的结果,导致数据不一致。

3.30 主从架构存在的问题,解决思路

  1. 数据延迟
  2. 数据一致性问题
  3. 故障转移和恢复不及时,影响业务的连续性和可用性
  4. 复制冲突
  5. 配置和维护复杂

3.31 主从复制,从库误操作写入数据怎么办(主从不同步,会导致SQL线程停止)

​ 这种情况常发生于从库没有配置super_read_only=1,然后管理员错误地在从库增删了数据,导致从库与主库数据不一致。要解决这类问题,通常需要在从库执行反向操作,比如删掉这些错误新增的数据,通过手动的方式让主从数据恢复到之前一致状态。

第零步,停止主从复制

mysql > stop slave

第一步,查看出错的准确位置

​ 执行show slave status命令查看从库状态,获取当前已应用到的binlog信息,主要关注Last_Error中所提示的信息

第二步,确认位置

根据Last_Error中的报错信息获取具体出错的SQL

show binlog events in 'mysql-bin.032102' from 730019106 limit 10;  #找到对应行,该行中Info信息就是1973位置所做操作

第三步,回滚数据

定位出错误语句后只需要在从库执行反向操作处理这些数据即可,然后重新启动slave进程

第四步,开启从库

mysql > start slave

或者1~3步直接在从库中修改成原来的样子

3.32 主从复制,从库IO线程故障排查思路

一、检查基本连接信息

  1. 确认主库地址和端口
  2. 检查复制用户权限,密码
  3. 检查网络连通性

二、查看从库状态

  1. 执行SHOW SLAVE STATUS\G命令

    • 关注Slave_IO_Running字段,如果为No,则表示IO线程未运行。

    • 检查Last_IO_ErrorLast_IO_Errno字段

      • 这些字段提供了IO线程停止运行的最后错误信息和错误代码。

    根据错误信息和代码,可以初步判断故障原因。

3.33 主从复制中的延时从库,半同步复制,过滤复制使用场景

延时从库是指故意配置从库延迟一定时间复制主库的数据。

  • 适用于数据恢复

半同步复制要求主库在事务提交前,至少有一个从库已经接收到并记录了该事务的binlog日志。

  • 适用于数据一致性要求高、高可用性和容灾等场景;

过滤复制允许用户灵活指定哪些数据库或表需要被复制,哪些则不需要。

  • 适用于业务隔离、性能优化和数据迁移等场景。

    (逐步迁移特定的数据库或表,减少迁移过程中的风险和复杂性。)

3.34 MySQL的MHA高可用架构的原理

  1. 主节点监控

    • MHA Manager会不断监控主节点的状态,包括连接是否正常、主节点是否正常运行等。
  2. 自动故障检测
    • 当MHA Manager检测到主节点出现故障(如主节点宕机)时,会自动检测并确认主节点是否真的不可用。
  3. 故障切换
    • 一旦确认主节点不可用,MHA Manager会自动执行故障切换操作:

      • 从宕机的主节点保存二进制日志事件(binlog events),以确保数据不丢失。
      • 识别含有最新更新的从节点。
      • 应用差异的中继日志(relay log)到其他从节点,以确保所有从节点的数据一致性。
      • 将最新的二进制日志事件应用到其他从节点上。
      • 提升一个从节点为新的主节点。
      • 使其他从节点连接到新的主节点,并继续复制操作。
  4. 数据一致性保证
    • 在故障切换过程中,MHA会确保数据的一致性,避免数据丢失或冲突。
  5. 故障恢复
    • 当原始的主节点恢复正常后,MHA Manager会将其重新加入到主从复制架构中,并将其作为从节点与新的主节点同步数据。

3.35 如何部署MHA高可用架构

  • 搭建三台mysql数据库

  • 修改配置文件/etc/my.cnf

  • server-id

  • 开启binlog日志

  • 创建主从复制用户

  • 配置主从复制主机信息

  • 重启mysql

  • 开启GTID

  • 正式部署MHA

  • 工具包下载

  • 安装依赖包

  • 命令软连接(所有节点)

  • 部署管理节点(mha-manager:mysql-db03)

  • 编辑配置文件(manage节点)

  • 配置ssh信任(所有节点)

  • 启动测试(manage节点)

  • 启动MHA

三.mysql问答合集的更多相关文章

  1. MYSQL例题合集

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...

  2. MySQL:系列合集

    MySQL一:初识数据库 MySQL二:库操作 MySQL三:存储引擎 MySQL四:表操作 MySQL五:数据操作 MySQL六:索引原理与慢查询优化 MySQL七:数据备份 MySQL八:视图.触 ...

  3. MySQL基础合集

     我的小站 1.MySQL的优势 运行速度快 使用成本低 可移植性强 适用用户广 2.MySQL的运行机制 一个SQL语句,如select * from tablename ,从支持接口进来后,进入连 ...

  4. MySQL错误合集

    Error Code: 1052. Column 'Sno' in field list is ambiguous ambiguous意味含糊不清,常见于多个表中有相同名字的属性,在查询时需要分别说明 ...

  5. windows+mysql集群搭建-三分钟搞定集群

    注:本文来源:  陈晓婵   <  windows+mysql集群搭建-三分钟搞定集群   > 一:mysql集群搭建教程-基础篇 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一 ...

  6. Mysql安装与问题合集

    下载mysql https://dev.mysql.com/downloads/mysql/ 下载历史版本 看这篇文章 https://www.cnblogs.com/reyinever/p/8551 ...

  7. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  8. MySQL数据库企业集群项目实战(阶段三)

                              MySQL数据库企业集群项目实战(阶段三) 作者 刘畅 时间 2020-10-25 目录 1 架构拓扑图 1 1.1 方案一 1 1.2 方案二 2 ...

  9. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

  10. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...

随机推荐

  1. 解决Python使用GPU

    在Python中使用GPU进行计算通常涉及到一些特定的库,如NumPy.SciPy的GPU加速版本(如CuPy.PyCUDA等)或深度学习库(如TensorFlow.PyTorch等).这些库能够利用 ...

  2. 双等号==与equals的区别与联系

    ==与equals的区别与联系: 1)对于双等号==来说,比较的是值是否相等 如果双等号比较的是基本数据类型的变量,则直接比较变量的值是否相等, 如果双等号比较的是引用类型的变量,则比较的是所指向对象 ...

  3. Oracle 数据库 命令行安装

    Oracle 数据库 命令行安装 1. 准备工作 关闭 防火墙,关闭 SElinux 2. 安装相关依赖包 yum -y install binutils compat-libcap1 compat- ...

  4. 『vulnhub系列』Deathnote-1

    『vulnhub系列』Deathnote-1 下载地址: https://www.vulnhub.com/entry/deathnote-1,739/ 信息搜集: 使用nmap扫描存活主机,发现主机开 ...

  5. 使用jsp+servlet+mysql用户管理系统之用户注册-----------使用简单三层结构分析页面显示层(view),业务逻辑层(service),数据持久层(dao)

    View层:jsp+servlet: jsp: <%@ page language="java" contentType="text/html; charset=U ...

  6. 自己写一个 NODE/ATTR 的结构

    ## python 3.8 以上 from typing import Dict, List, TypeVar, Tuple, Generic, get_args import json T = Ty ...

  7. JavaSE 计算2个List集合中的交集、差集、并集、去重并集

    VideoOrder.java 重写里面的equals和hashCode方法 class VideoOrder { private int price; private String title; p ...

  8. Oracle 字符串分割,并将内码转中文(简单实现),项目实战

    导读 实际项目开发过程中,可能会遇到这种情况,A表中A1字段存储B表中的内码如(1,2,3),此时需要将A表中的A1字段转中文,为了方便理解,我们这里创建学生表和老师表,一个学生对应N个老师. 创建表 ...

  9. 面向对象VS面向过程

    什么是面向对象呢? 对于接触或者熟悉一些编程知识的同学来讲,"面向对象"这个词儿一点儿也不陌生.经常听说XX语言是完全面向对象的编程语言,比如C#.Java这些便是完全面向对象的编 ...

  10. 今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型

    一.写在开头 很久没更新喽,最近build哥一直在忙着工作,忙着写小说,都忘记学习自己的本职了,哈哈,不过现在正式回归! 我们继续学习Java的IO相关内容,之前我们了解到,所谓的IO(Input/O ...