Java基础IO流全解析:常用知识点与面试高频考点汇总

前言

IO(Input/Output)流是Java中处理数据传输的核心机制,无论是文件操作、网络通信还是数据持久化,都离不开IO流的身影。对于Java初学者而言,IO流的分类多、类库庞大,容易混淆;而在面试中,IO流也是高频考点——从基础分类到缓冲原理,从异常处理到序列化,都是面试官常问的内容。

本文将从基础框架出发,梳理IO流的核心分类与常用API,深入解析面试高频问题,并通过代码示例落地实践,帮你彻底搞懂Java IO流。

一、IO流的整体框架:先理清“分类”再学用法

Java IO流的设计遵循“分层”和“职责单一”原则,整体可通过3个维度进行分类。理解分类是掌握IO流的前提,也是面试基础题的高频考点。

1.1 按“数据流向”分类

这是最直观的分类方式,以程序为参照物,分为输入流和输出流:

  • 输入流(Input Stream):数据从外部(文件、网络、键盘等)流向程序,用于“读取”数据;
  • 输出流(Output Stream):数据从程序流向外部,用于“写入”数据。

面试注意:输入/输出是相对程序而言的,比如“读取文件”用输入流,“写入文件”用输出流。

1.2 按“数据单位”分类

这是IO流最核心的分类,决定了流的适用场景:

  • 字节流:以“字节(byte,8位)”为单位传输数据,可处理所有类型数据(文本、图片、音频、视频等);
  • 字符流:以“字符(char,16位)”为单位传输数据,仅用于处理文本数据(需指定编码,如UTF-8、GBK)。

本质区别:字节流是“无编码依赖”的原始数据传输,字符流是“编码依赖”的文本数据传输(字节→字符的转换需要编码映射)。

1.3 按“角色”分类

按流在数据处理中的职责,分为节点流和处理流(装饰器模式的典型应用):

  • 节点流(低级流):直接对接数据源(如文件、内存、网络),是IO流的“基础”;
    例:FileInputStream(直接读文件)、ByteArrayInputStream(直接读内存字节数组)。
  • 处理流(高级流):不直接对接数据源,而是包装“节点流或其他处理流”,增强功能(如缓冲、转换、对象序列化);
    例:BufferedInputStream(缓冲增强)、InputStreamReader(字节→字符转换)。

设计优势:通过“包装”可灵活组合功能,比如“FileInputStream + BufferedInputStream”既实现文件读取,又具备缓冲加速。

1.4 IO流核心分类结构图

用思维导图清晰展示核心流的继承关系(面试常考“流的继承体系”):

字符输出
字符输入
字节输出
字节输入
Writer
FileWriter
CharArrayWriter
BufferedWriter
OutputStreamWriter
PrintWriter
Reader
FileReader
CharArrayReader
BufferedReader
InputStreamReader
OutputStream
FileOutputStream
ByteArrayOutputStream
ObjectOutputStream
BufferedOutputStream
DataOutputStream
InputStream
FileInputStream
ByteArrayInputStream
ObjectInputStream
BufferedInputStream
DataInputStream
Java IO 体系

1.5 核心接口与抽象类

Java IO流通过4个核心抽象类定义规范,所有具体流都直接/间接继承它们:

抽象类数据单位方向核心方法
InputStream字节输入int read()read(byte[] b)
OutputStream字节输出void write(int b)write(byte[] b)
Reader字符输入int read()read(char[] c)
Writer字符输出void write(int c)write(char[] c)

面试考点:这4个类都是抽象类,不能直接实例化,必须使用它们的子类(如FileInputStream)。

二、常用IO流详解:从基础到实战

掌握以下10种常用流的用法,可覆盖90%的日常开发场景,也是面试中“手写IO代码”的高频考点。

2.1 字节流:处理所有数据类型

字节流是IO流的“基础”,可处理任意数据(文本、图片、视频等),核心是FileInputStream/FileOutputStream(节点流)和BufferedInputStream/BufferedOutputStream(处理流)。

(1)FileInputStream & FileOutputStream:文件字节流

直接操作文件的节点流,用于读取/写入二进制文件(如图片、视频)或文本文件(需手动处理编码)。

核心方法

  • FileInputStream
    • int read():读1个字节,返回字节值(0-255),读到末尾返回-1
    • read(byte[] buffer):读多个字节到缓冲区,返回实际读取的字节数,末尾返回-1(推荐,效率高于单个读)。
  • FileOutputStream
    • write(int b):写1个字节(只取int的低8位);
    • write(byte[] buffer):写缓冲区的所有字节;
    • write(byte[] buffer, int off, int len):写缓冲区从off开始的len个字节。

代码示例:用字节流复制图片(核心面试题)

import java.io.*;/*** 用FileInputStream+FileOutputStream复制图片* 面试注意:字节流可复制任意文件,字符流不能复制非文本文件(会损坏)*/
public class FileCopyDemo {public static void main(String[] args) {// 1. 定义源文件和目标文件路径String sourcePath = "D:/test.jpg";String targetPath = "D:/test_copy.jpg";// 2. 声明流对象(try-with-resources外声明,便于关闭)InputStream fis = null;OutputStream fos = null;try {// 3. 实例化流(节点流直接对接文件)fis = new FileInputStream(sourcePath);fos = new FileOutputStream(targetPath); // 若目标文件不存在,会自动创建// 4. 定义缓冲区(减少IO次数,提高效率)byte[] buffer = new byte[1024 * 8]; // 8KB缓冲区int len; // 记录每次实际读取的字节数// 5. 循环读取并写入while ((len = fis.read(buffer)) != -1) {// 注意:必须写len个字节,避免最后一次读取的缓冲区有残留数据fos.write(buffer, 0, len);}System.out.println("图片复制成功!");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 6. 关闭流(必须关闭,释放系统资源)// 注意:先关输出流,再关输入流;分别try-catch避免一个关闭失败影响另一个if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
}

面试高频问题

  • 为什么要用byte[] buffer?答:减少“用户态→内核态”的切换次数(IO操作是内核态),单个字节读效率极低,缓冲区越大效率越高(但不宜过大,避免内存浪费)。
  • 为什么write时要传0len?答:最后一次读取时,缓冲区可能未填满,若写整个缓冲区会包含垃圾数据,导致文件损坏。
(2)BufferedInputStream & BufferedOutputStream:缓冲字节流

处理流,包装节点流后提供“内部缓冲区”(默认8KB),无需手动定义缓冲区,进一步提高读写效率。

核心原理

  • 读数据时:先从数据源读入缓冲区,程序从缓冲区取数据,缓冲区空了再读数据源;
  • 写数据时:先写入缓冲区,缓冲区满了再一次性写入数据源(可调用flush()强制刷新缓冲区)。

代码示例:用缓冲字节流优化文件复制

public class BufferedCopyDemo {public static void main(String[] args) {String sourcePath = "D:/test.mp4";String targetPath = "D:/test_copy.mp4";// JDK7+ 推荐:try-with-resources 自动关闭流(实现AutoCloseable接口的类均可)try (// 包装节点流:缓冲流增强功能InputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));OutputStream bos = new BufferedOutputStream(new FileOutputStream(targetPath))) {byte[] buffer = new byte[1024 * 8];int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);// 无需手动flush():close()时会自动刷新,或缓冲区满了自动刷新}System.out.println("视频复制成功(缓冲流优化)!");} catch (IOException e) {e.printStackTrace();}// 无需手动close():try-with-resources会自动关闭,且关闭顺序是“先关外层处理流,再关内层节点流”}
}

面试考点

  • 缓冲流的效率为什么比节点流高?答:减少了实际的IO操作次数(缓冲区批量读写);
  • flush()的作用?答:强制将缓冲区中的数据写入数据源(如网络传输中,需即时发送数据时调用,避免数据滞留)。

2.2 字符流:专门处理文本数据

字符流是“字节流+编码”的封装,核心解决文本数据的“中文乱码”问题。常用流包括FileReader/FileWriter(简单文本)、BufferedReader/BufferedWriter(缓冲+按行读)、InputStreamReader/OutputStreamWriter(字节→字符转换,核心)。

(1)InputStreamReader & OutputStreamWriter:转换流(核心面试点)

处理流,是字节流与字符流的桥梁——将字节流按指定编码转换为字符流,解决文本读写的中文乱码问题。

为什么需要转换流?
文本文件本质是字节序列,但不同编码(UTF-8、GBK)对中文的字节映射不同(如“中”在UTF-8中是3个字节,在GBK中是2个字节)。若直接用字节流读文本,需手动转换编码,容易出错;转换流则自动完成“字节→字符”的编码映射。

核心构造方法

  • InputStreamReader(InputStream in, String charsetName):字节输入流→字符输入流,指定编码(如“UTF-8”);
  • OutputStreamWriter(OutputStream out, String charsetName):字符输出流→字节输出流,指定编码。

代码示例:用转换流按UTF-8读写文本(解决乱码)

public class ConvertStreamDemo {public static void main(String[] args) {String filePath = "D:/test.txt";// 1. 写文本(指定UTF-8编码)try (// 字节输出流→转换流(指定UTF-8)Writer osw = new OutputStreamWriter(new FileOutputStream(filePath), "UTF-8");// 再包装缓冲流(按行写更方便)BufferedWriter bw = new BufferedWriter(osw)) {bw.write("Java IO流");bw.newLine(); // 换行(跨平台兼容,比"\n"好)bw.write("转换流解决中文乱码");bw.flush(); // 强制刷新(缓冲流写文本时,建议手动flush())System.out.println("文本写入成功!");} catch (IOException e) {e.printStackTrace();}// 2. 读文本(必须与写入编码一致,否则乱码)try (// 字节输入流→转换流(指定UTF-8)Reader isr = new InputStreamReader(new FileInputStream(filePath), "UTF-8");// 包装缓冲流(支持按行读)BufferedReader br = new BufferedReader(isr)) {String line;// 按行读(readLine()返回null表示末尾)while ((line = br.readLine()) != null) {System.out.println("读取到:" + line);}} catch (IOException e) {e.printStackTrace();}}
}

面试高频问题:如何解决Java IO中的中文乱码?
答:核心是“读写编码一致”,具体方案:

  1. 用转换流InputStreamReader/OutputStreamWriter,明确指定编码(如UTF-8);
  2. 避免使用FileReader/FileWriter(它们默认使用系统编码,跨平台易乱码);
  3. 读写文本时优先用缓冲字符流(BufferedReader/BufferedWriter),支持按行操作。
(2)BufferedReader & BufferedWriter:缓冲字符流

处理流,包装字符流后提供“按行读写”功能(readLine()/newLine()),是处理文本文件的“首选”。

核心优势

  • BufferedReader.readLine():一次读取一整行文本(不含换行符),比read(char[])更方便;
  • BufferedWriter.newLine():跨平台换行(Windows是\r\n,Linux是\n,自动适配)。

代码示例:用缓冲字符流复制文本文件

public class BufferedCharCopyDemo {public static void main(String[] args) {String source = "D:/source.txt";String target = "D:/target.txt";try (// 字节流→转换流(UTF-8)→缓冲流BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), "UTF-8"));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), "UTF-8"))) {String line;while ((line = br.readLine()) != null) {bw.write(line); // 写一行文本bw.newLine(); // 换行}System.out.println("文本复制成功!");} catch (IOException e) {e.printStackTrace();}}
}

2.3 对象流:序列化与反序列化(面试重点)

对象流ObjectInputStream/ObjectOutputStream是处理流,用于将“Java对象”转换为字节序列(序列化),或从字节序列恢复为Java对象(反序列化)——核心解决“对象持久化”和“网络传输”问题。

(1)序列化的核心条件

一个对象要能被序列化,必须满足2个条件(面试必问):

  1. 类必须实现java.io.Serializable接口(标记接口,无任何抽象方法,仅作标记);
  2. 类中所有非静态(non-static)、非瞬态(non-transient)的成员变量都会被序列化。
(2)核心API与示例
  • ObjectOutputStream.writeObject(Object obj):序列化对象;
  • ObjectInputStream.readObject():反序列化对象(返回Object,需强转)。

代码示例:对象序列化与反序列化

import java.io.*;
import java.util.Date;// 1. 实现Serializable接口(标记为可序列化)
class User implements Serializable {// 2. 建议显式声明serialVersionUID(避免类结构变化导致反序列化失败)private static final long serialVersionUID = 1L;private String username;private transient String password; // transient:瞬态变量,不参与序列化private int age;private Date registerTime; // Date已实现Serializable,可序列化// 构造方法、getter/setterpublic User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;this.registerTime = new Date();}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' + // 反序列化后为null", age=" + age +", registerTime=" + registerTime +'}';}
}public class ObjectStreamDemo {public static void main(String[] args) {String filePath = "D:/user.obj";// 1. 序列化:将User对象写入文件try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) {User user = new User("zhangsan", "123456", 20);oos.writeObject(user); // 序列化对象System.out.println("对象序列化成功!");} catch (IOException e) {e.printStackTrace();}// 2. 反序列化:从文件恢复User对象try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) {User user = (User) ois.readObject(); // 反序列化,强转类型System.out.println("反序列化得到:" + user);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

输出结果

对象序列化成功!
反序列化得到:User{username='zhangsan', password='null', age=20, registerTime=Wed Sep 01 15:30:00 CST 2025}
(3)面试高频考点:序列化的注意事项
  1. serialVersionUID的作用
    答:用于验证序列化与反序列化的类版本一致性。若序列化时类的serialVersionUID与反序列化时不一致(如类新增/删除字段且未显式声明),会抛出InvalidClassException建议显式声明,避免默认生成(默认值由类结构计算,易变)。

  2. transient关键字的作用
    答:标记“瞬态变量”,不参与序列化(反序列化后为默认值,如null、0)。常用于敏感字段(如密码),避免序列化泄露。

  3. 静态变量会被序列化吗?
    答:不会。静态变量属于类,不属于对象,序列化仅针对对象的实例数据。

  4. 哪些类型不能被序列化?
    答:未实现Serializable的类(如ThreadInputStream)、匿名内部类(无serialVersionUID)、瞬态变量。

三、IO流面试高频问题汇总(附标准答案)

结合前文知识点,整理面试中最常问的10个问题,帮你直击考点。

1. 字节流和字符流的区别是什么?

维度字节流字符流
数据单位字节(8位)字符(16位)
处理数据类型所有类型(文本、图片、视频)仅文本类型
编码依赖有(需指定编码,如UTF-8)
核心抽象类InputStream/OutputStreamReader/Writer
适用场景复制文件、网络传输读写文本文件、处理中文

一句话总结:字节流是“万能流”,字符流是“文本专用流”,中文处理优先用字符流。

2. 什么是节点流?什么是处理流?它们的关系是什么?

  • 节点流:直接对接数据源,是IO的基础(如FileInputStream读文件);
  • 处理流:包装节点流/其他处理流,增强功能(如缓冲、转换、序列化);
  • 关系:处理流依赖节点流,通过“装饰器模式”动态扩展功能(面试可提设计模式,加分)。

3. 为什么要关闭流?如何正确关闭流?

  • 关闭原因:流操作会占用系统资源(如文件句柄、网络连接),不关闭会导致资源泄露,最终耗尽系统资源。
  • 正确关闭方式
    1. JDK7之前:用finally块关闭,先关外层处理流,再关内层节点流,且分别try-catch(避免一个关闭失败影响另一个);
    2. JDK7之后:优先用try-with-resources(自动关闭实现AutoCloseable接口的流,代码更简洁,且关闭顺序正确)。

4. try-with-resources的原理是什么?

  • 原理:编译器会自动为try-with-resources块生成finally块,在其中调用流的close()方法;
  • 要求:括号内的对象必须实现AutoCloseable接口(IO流都已实现);
  • 优势:避免漏关流,代码更简洁,且能正确处理多个流的关闭顺序(先关后声明的流)。

5. 缓冲流的工作原理是什么?为什么能提高效率?

  • 工作原理:缓冲流内部维护一个缓冲区(默认8KB),读写数据时先操作缓冲区,缓冲区满/空时再与数据源交互;
  • 效率提升原因:减少了“用户态与内核态的切换次数”——IO操作是内核态,频繁切换开销大,缓冲流通过批量读写降低切换次数。

6. 如何解决IO流中的中文乱码问题?

核心是“读写编码一致”,具体方案:

  1. 读写文本时,优先用转换流InputStreamReader/OutputStreamWriter,明确指定编码(如UTF-8);
  2. 避免使用FileReader/FileWriter(默认使用系统编码,跨平台易乱码);
  3. 若用第三方库(如Apache Commons IO),确保编码参数一致。

7. 序列化的条件是什么?transient关键字的作用是什么?

  • 序列化条件
    1. 类实现Serializable接口;
    2. 显式声明serialVersionUID(建议);
    3. 非静态、非瞬态的成员变量可序列化。
  • transient作用:标记瞬态变量,不参与序列化,反序列化后为默认值(如null),用于保护敏感字段(如密码)。

8. 序列化时,若类的结构发生变化(如新增字段),反序列化会失败吗?

  • 显式声明了serialVersionUID:反序列化不会失败,新增字段为默认值,删除的字段会被忽略;
  • 未显式声明:类结构变化会导致serialVersionUID自动变化,反序列化抛出InvalidClassException

9. 用字节流复制文本文件和用字符流复制文本文件的区别是什么?

  • 字节流:复制的是原始字节序列,不涉及编码,复制后文本文件编码不变;
  • 字符流:复制时会经过“字节→字符→字节”的转换,需确保读写编码一致,否则会导致乱码;
  • 建议:复制文本文件优先用字符流(便于按行处理),复制非文本文件必须用字节流(字符流会损坏数据)。

10. BufferedReader的readLine()方法会读取换行符吗?如何实现换行?

  • readLine()不会读取换行符,返回的字符串不含\r\n
  • 写换行时,用BufferedWriter.newLine()(跨平台兼容),避免直接写\n(Windows下不识别为换行)。

四、总结

Java IO流的学习核心是“先分类,再用法,后原理”:

  1. 分类是基础:按流向、数据单位、角色理清流的体系,避免混淆;
  2. 用法是核心:掌握字节流(文件+缓冲)、字符流(转换+缓冲)、对象流的常用API,能手写文件复制、序列化等代码;
  3. 原理是考点:理解缓冲流的效率原理、序列化的条件、try-with-resources的机制,应对面试中的深度问题。

IO流是Java基础的重点,也是后续学习Java Web(如Servlet输入输出)、Netty(网络IO)的基础,务必扎实掌握!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95451.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95451.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95451.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF.AI-与你的PDF文档对话

本文转载自:PDF.AI-与你的PDF文档对话 - Hello123工具导航 ** 一、🤖 PDF.AI:秒懂 PDF 的智能对话助手 PDF.AI 是一款超实用的AI 文档分析工具,专门帮你快速搞定各种 PDF 文件。不管多长的合同、报告或论文,你只需上…

微软出品!这个免费开源工具集获得了GitHub 123k程序员点赞

大家晚上好,我是顾北,是一名AI应用探索者,当然也是GitHub开源项目收集爱好者。最近我在整理Windows效率工具时,发现了一个让我一晚上没睡着觉的开源项目——微软官方出品的 PowerToys,可谓是彻夜难眠啊。经过我两个月多…

【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效!

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效! 目录 前言 什么是 useTemplateRef 传统 ref 的问题 useTemplateRef 的优势 基础用法 进阶用法 最佳实践 迁移指南 性能对比 注意事项 总结 前言 Vue 3.5 带来了一个激动人心的新特性 useTemplateRef,它彻底革…

uni app 的app端 写入运行日志到指定文件夹。

uni app 的app 端 写入指定目录文件夹。并自动生成当前日期的日志文件。删除十日前的日志文件其中 writefile.js 代码如下const {default: logger } require("./logger")var name var url var params var method var resfunction setlog(name, url, params, method)…

桌面应用开发语言与框架选择指南

桌面应用开发的语言和框架选择非常丰富,从原生性能到跨平台解决方案应有尽有。下面我将它们分为几大类进行详细介绍,并附上各自的优缺点和适用场景。 一、 原生开发 (Native Development) 原生开发能提供最佳的性能和与操作系统最完美的集成体验。 1. …

C++知识

文章目录1.Cmap为什么线程不安全?2.map大量插入会有性能问题,为什么3.set的应用场景4.map set mutiset mutimap unordered_map unordered_set的底层实现、使用场景、优缺点1.Cmap为什么线程不安全? 其实STL中的容器都是线程不安全的,如果想要线程安全…

自学嵌入式第三十四天:网络编程-TCP

一、UDP用户数据报收发次数要对应;数据与数据之间有边界,多次调用收发时都是不同的数据报;接收方的数据大小>发送方的数据大小,如果接受方数据小了则会丢弃未读的部分,再次调用只会读下一包数据;二、服务…

Apache IoTDB:国产时序数据库的崛起与工业物联网的未来

📑前言 在工业物联网的浪潮中,数据不再是副产品,而是驱动决策的核心资产。"随着物联网、工业互联网和智能监控的迅猛发展,时序数据正以前所未有的速度爆发。据预测,到2025年全球物联网设备将达750亿台&#xff0c…

一键核验,安全无忧!手机号三要素详情版API,为您的业务筑牢身份认证防线

一、什么是手机号三要素核验API? 手机号三要素核验API 是一种通过编程接口,实时验证一条个人身份信息是否与该国运营商登记的实名信息一致的在线服务。 这里的“三要素”特指: 姓名 身份证号码 手机号码 核验过程:用户提交上述三个…

轻松上手 qData 数据中台开源版:Docker Compose 助你10分钟跑起来

说在前面 谁适合看这份指南? 初次接触 qData,希望快速体验功能的小伙伴不想折腾复杂环境配置和前端打包的人想用“一键启动”省事体验完整平台的用户 我们已经为你准备好“开箱即用”的完整部署包,包括: ✅ 前端静态资源&…

Qt读写Excel--QXlsx基本使用

1、概述 Document 类是一个用于操作 XLSX 文件的类,继承自 QObject。它提供了对 Excel 文件的读写操作,包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外,它还支持对工作簿和工作表的操作…

P13929 [蓝桥杯 2022 省 Java B] 山 题解

缩减一下题目的意思,问区间 [2022,2022222022] 有多少个数是回文数并且先单调不减,后单调不增。 因为有这两条条件,我们可以得知在判断时只用判断前半段的每个数是不是和对面相应的位置相等,以及是否单调不减。 为什么不用看后半段…

Unity Android 文件的读写

配置AndroidManifest 文件在Assets 目录下查找AndroidManifest 文件&#xff0c;添加权限声明&#xff0c;在application 节点中添加requestLegacyExternalStorage 属性。<!-- 权限声明 --> <uses-permission android:name"android.permission.READ_EXTERNAL_STO…

Pydantic模型验证测试:你的API数据真的安全吗?

url: /posts/03b2afdf35f55dbaef631710ab6da82c/ title: Pydantic模型验证测试:你的API数据真的安全吗? date: 2025-09-03T23:46:18+08:00 lastmod: 2025-09-03T23:46:18+08:00 author: cmdragon summary: Pydantic在FastAPI中用于数据验证和序列化,通过Python类型注解自动…

【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管

目录 0案例视频效果展示 0.1例子1&#xff1a;INT0控制LED闪烁 0.2例子2&#xff1a;INT0中断控制数码管计数 0.3例子3&#xff1a;INT0中断实现秒表功能 0.4例子4&#xff1a;INT0INT1中断控制数码管计数 1基础知识补充——中断系统 1.1 中断源一览 1.2 控制寄存器 1…

MTK Linux DRM分析(三十三)- MTK mtk_mipi_tx.c

一、MIPI PHY驱动简介 1. MIPI 协议分层 应用层:显示(DSI)、摄像头(CSI)。 协议层:定义像素/图像帧如何封装成数据包。 物理层(PHY):具体电气信号传输方式 —— 这里就是 D-PHY 或 C-PHY。 2. D-PHY(Differential PHY) 传输方式:差分信号(类似 LVDS/USB/PCIe …

G2D 图形加速器

文章目录G2D 图形加速器1. 功能简介1.1 矩形填充1.2 旋转和镜像 (rotate and mirror)1.3 透明度混合1.4 colorkey1.5 缩放 (Stretchblt)2. G2D 框架3. 全志 G2D 使用示例3.1 使用G2D实现图像旋转缩放3.2 实时预览中加入旋转缩放功能G2D 图形加速器 G2D模块主要实现图像旋转、数…

【FPGA】单总线——DS18B20

目录 项目&#xff1a;项目&#xff08;含quartus工程、仿真文件&#xff09; 1. 单总线通信时序详解 1.1 初始化&#xff08;复位脉冲 存在脉冲&#xff09; 1.2 写时隙&#xff08;写“0”和写“1”&#xff09; 1.3 读时隙 2. DS18B20 暂存器与温度数据格式 2.1 暂存…

JUC的安全并发包机制

目录 1. Lock机制&#xff1a;明锁控制 2. 栅栏机制(CyclicBarrier) 3. 闭锁机制(CountDownLatch) 4. 信号量机制(Semaphore) 5. 无锁机制 1. Lock机制&#xff1a;明锁控制 Lock接口提供了比synchronized更灵活的锁机制&#xff0c;属于明锁&#xff08;需要手动获取和释…