Java基礎IO流全解析:常用知識點與面試高頻考點匯總

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;需要手動獲取和釋…