2025/7/15——java學習總結

Java IO、Stream、異常與 File 全體系總結:從基礎到進階的完整突破

一、核心知識深耕:四大模塊的體系與底層邏輯

(一)IO 流:數據傳輸的基礎通道

  1. 體系架構與核心分類

    • 按流向:輸入流(InputStream/Reader)、輸出流(OutputStream/Writer)。
    • 按數據單位
      • 字節流:處理所有數據(二進制、文本),核心類?FileInputStream/FileOutputStream
      • 字符流:處理文本數據(自動編碼轉換),核心類?FileReader/FileWriterInputStreamReader(指定編碼)。
    • 按角色
      • 節點流:直接操作數據源(如?FileInputStream)。
      • 處理流:增強節點流功能(如?BufferedInputStream?加緩沖、ObjectInputStream?序列化)。
  2. 核心方法與特性

    • 字節流:read()/write()(單字節或字節數組)。
    • 字符流:read()/write()(字符或字符數組)、BufferedReader.readLine()(按行讀取)。
    • 資源管理:實現?AutoCloseable?接口,支持?try-with-resources?自動關閉。

(二)Java 8 Stream:集合數據的高效處理

  1. 核心概念與特性

    • 定義:基于數據源(集合、數組)的元素序列,支持聲明式操作(過濾、映射、聚合等)。
    • 特性
      • 惰性執行:中間操作(如?filter)僅記錄邏輯,終端操作(如?collect)才觸發執行。
      • 一次性消費:流只能遍歷一次,再次使用需重新創建。
      • 并行處理:通過?parallelStream()?實現多線程并行操作。
  2. 操作分類

    • 中間操作(返回新流):
      • 過濾:filter(Predicate)
      • 映射:map(Function)flatMap(Function)(將流扁平化)
      • 排序:sorted()sorted(Comparator)
    • 終端操作(返回非流結果):
      • 聚合:collect(Collector)(如?Collectors.toList())、count()max(Comparator)
      • 遍歷:forEach(Consumer)
      • 匹配:anyMatch(Predicate)allMatch(Predicate)

(三)異常處理:程序容錯的核心機制

  1. 異常體系結構

    • 頂層父類Throwable,分為:
      • Error:虛擬機錯誤(如?OutOfMemoryError),無法處理,需避免。
      • Exception:程序可處理的異常,分為:
        • 編譯時異常(Checked):如?IOExceptionClassNotFoundException,必須顯式處理。
        • 運行時異常(Unchecked):如?NullPointerExceptionIndexOutOfBoundsException,繼承自?RuntimeException,可選擇處理。
  2. 異常處理方式

    • 捕獲try-catch-finally?塊,finally?用于釋放資源(如流關閉)。
    • 聲明拋出throws?關鍵字,將異常交給上層處理。
    • 自定義異常:繼承?Exception?或?RuntimeException,封裝業務異常信息。

(四)File 類:文件系統的抽象表示

  1. 核心功能

    • 表示文件或目錄的路徑(不直接操作文件內容)。
    • 關鍵方法:
      • 路徑操作:getAbsolutePath()getPath()getName()
      • 存在性判斷:exists()isFile()isDirectory()
      • 創建 / 刪除:createNewFile()mkdirs()(多級目錄)、delete()
      • 列表獲取:list()(文件名數組)、listFiles()(File 對象數組)。
  2. 路徑特性

    • 絕對路徑:從根目錄開始(如?C:/test/file.txt)。
    • 相對路徑:相對于當前工作目錄(如?src/main/java)。
    • 跨平臺兼容:通過?File.separator?替代硬編碼的?/?或?\

二、實踐突破:四大模塊的場景化應用

(一)IO 流實戰:文件處理與編碼控制

1. 大文件拷貝(緩沖流優化)

java

public class LargeFileCopy {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();// 緩沖流 + 大字節數組提升效率try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.iso"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("target.iso"))) {byte[] buffer = new byte[8192 * 4]; // 32KB緩沖區int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}}System.out.println("拷貝完成,耗時:" + (System.currentTimeMillis() - start) + "ms");}
}
2. 字符流處理編碼(避免亂碼)

java

public class EncodingHandler {public static void main(String[] args) {String content = "Java IO流與編碼處理";String path = "encoding_test.txt";// 用UTF-8編碼寫入try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8);BufferedWriter bw = new BufferedWriter(osw)) {bw.write(content);} catch (IOException e) {e.printStackTrace();}// 用UTF-8解碼讀取try (InputStreamReader isr = new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(isr)) {String line;while ((line = br.readLine()) != null) {System.out.println("讀取內容:" + line);}} catch (IOException e) {e.printStackTrace();}}
}

(二)Stream API 實戰:集合數據處理

1. 復雜對象集合處理

java

class User {private String name;private int age;private String city;// 構造器、getter省略
}public class StreamDemo {public static void main(String[] args) {List<User> users = Arrays.asList(new User("張三", 25, "北京"),new User("李四", 30, "上海"),new User("王五", 28, "北京"),new User("趙六", 35, "廣州"));// 需求:篩選北京的用戶,按年齡排序,提取姓名并拼接String result = users.stream().filter(u -> "北京".equals(u.getCity())) // 過濾北京用戶.sorted(Comparator.comparingInt(User::getAge)) // 按年齡排序.map(User::getName) // 提取姓名.collect(Collectors.joining(",", "北京用戶:", "。")); // 拼接System.out.println(result); // 輸出:北京用戶:張三,王五。}
}
2. 并行流處理大數據量

java

public class ParallelStreamDemo {public static void main(String[] args) {// 生成1000萬個隨機數List<Integer> numbers = new ArrayList<>(10_000_000);Random random = new Random();for (int i = 0; i < 10_000_000; i++) {numbers.add(random.nextInt(1000));}// 并行流計算偶數之和long start = System.currentTimeMillis();long sum = numbers.parallelStream().filter(n -> n % 2 == 0).mapToLong(Integer::longValue).sum();System.out.println("偶數和:" + sum + ",耗時:" + (System.currentTimeMillis() - start) + "ms");}
}

(三)異常處理實戰:優雅的錯誤控制

1. 多異常捕獲與資源自動關閉

java

public class ExceptionHandling {public static void readFile(String path) {// try-with-resources自動關閉資源,多異常用|分隔try (BufferedReader br = new BufferedReader(new FileReader(path))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (FileNotFoundException e) {System.err.println("文件不存在:" + path);} catch (IOException e) {System.err.println("讀取失敗:" + e.getMessage());}}
}
2. 自定義異常與異常鏈

java

// 自定義業務異常
class InsufficientFundsException extends Exception {public InsufficientFundsException(String message) {super(message);}
}public class CustomExceptionDemo {public static void withdraw(double amount) throws InsufficientFundsException {double balance = 1000;if (amount > balance) {// 包裝原始異常為自定義異常throw new InsufficientFundsException("余額不足,當前余額:" + balance);}}public static void main(String[] args) {try {withdraw(1500);} catch (InsufficientFundsException e) {e.printStackTrace();// 處理業務異常}}
}

(四)File 類實戰:文件系統操作

1. 遞歸遍歷目錄并統計文件類型

java

public class FileTraversal {public static void main(String[] args) {File dir = new File("D:/project");Map<String, Integer> typeCount = new HashMap<>();traverse(dir, typeCount);// 輸出統計結果typeCount.forEach((type, count) -> System.out.println(type + "文件:" + count + "個"));}private static void traverse(File file, Map<String, Integer> typeCount) {if (file.isDirectory()) {File[] children = file.listFiles();if (children != null) { // 避免空指針for (File child : children) {traverse(child, typeCount);}}} else {// 獲取文件后綴String name = file.getName();int dotIndex = name.lastIndexOf('.');String type = (dotIndex == -1) ? "無后綴" : name.substring(dotIndex);// 更新計數typeCount.put(type, typeCount.getOrDefault(type, 0) + 1);}}
}
2. 文件批量重命名

java

public class FileRename {public static void main(String[] args) {File dir = new File("D:/photos");File[] files = dir.listFiles(f -> f.isFile() && f.getName().endsWith(".jpg"));if (files != null) {for (int i = 0; i < files.length; i++) {File oldFile = files[i];String newName = "travel_" + (i + 1) + ".jpg";File newFile = new File(dir, newName);if (oldFile.renameTo(newFile)) {System.out.println("重命名成功:" + newName);}}}}
}

三、底層原理:四大模塊的運行機制

(一)IO 流的底層實現

  1. 字節流與系統調用

    • FileInputStream.read()?最終調用?native 方法(如?read0()),通過操作系統內核讀取文件數據。
    • 緩沖流(BufferedInputStream)內部維護字節數組緩沖區,減少系統調用次數(一次讀取 8KB,而非單字節)。
  2. 字符流的編碼轉換

    • InputStreamReader?使用?CharsetDecoder?將字節按指定編碼(如 UTF-8)解碼為字符。
    • 多字節字符(如中文)需連續讀取完整字節序列,否則會產生亂碼。

(二)Stream API 的執行原理

  1. 惰性求值機制

    • 中間操作(如?filter)僅構建操作管道,不實際執行。
    • 終端操作(如?collect)觸發整個管道執行,采用流水線方式處理元素。
  2. 并行流實現

    • 基于?Fork/Join?框架,將數據源拆分為多個子任務,通過多線程并行處理。
    • 適用于 CPU 密集型任務,IO 密集型任務并行優勢不明顯。

(三)異常處理的底層機制

  1. 異常表與棧跟蹤

    • 編譯期生成異常表,記錄?try-catch?塊的范圍和處理的異常類型。
    • 異常拋出時,JVM 通過異常表查找匹配的?catch?塊,若未找到則終止線程并打印棧跟蹤(printStackTrace())。
  2. try-with-resources?原理

    • 編譯器自動生成?finally?塊,調用資源的?close()?方法,確保資源釋放。
    • 多個資源按聲明逆序關閉(先關最后聲明的資源)。

(四)File 類與文件系統交互

  1. 路徑解析

    • 依賴操作系統的文件系統接口,將抽象路徑轉換為系統實際路徑。
    • 相對路徑解析基于?user.dir?系統屬性(程序運行目錄)。
  2. 文件操作的原子性

    • renameTo()?方法在不同文件系統間可能非原子操作,可能導致文件丟失。
    • 目錄刪除(delete())僅支持空目錄,非空目錄需遞歸刪除子文件。

四、總結與展望:從整合到進階

今日突破

  • 知識整合:貫通 IO 流(數據傳輸)、Stream(數據處理)、異常(容錯機制)、File(文件系統)四大模塊,形成完整的數據處理鏈路。
  • 實踐能力:掌握大文件高效處理、編碼控制、集合流處理優化、異常優雅處理、文件系統批量操作等實戰技能。
  • 底層認知:理解 IO 流的系統調用、Stream 的惰性執行、異常表機制、File 與操作系統交互等底層邏輯。

后續進階方向

  1. NIO 與異步 IO

    • 學習?java.nio?包的通道(Channel)、緩沖區(Buffer)、選擇器(Selector),掌握非阻塞 IO 模型。
    • 異步 IO(AsynchronousFileChannel)提升高并發場景下的性能。
  2. Stream 高級應用

    • 自定義收集器(Collector)處理復雜聚合邏輯。
    • 流的并行策略優化(如?Spliterator?自定義拆分)。
  3. 異常處理模式

    • 學習異常轉譯(將底層異常轉為業務異常)、異常重試機制、全局異常處理器(如 Spring 的?@ControllerAdvice)。
  4. 文件系統高級操作

    • 學習?java.nio.file?包(PathFilesFileSystem),支持更豐富的文件操作(如文件屬性、符號鏈接)。

通過四大模塊的協同學習,不僅能應對日常開發中的數據處理需求,更能深入理解 Java 的 IO 模型、函數式編程、容錯設計等核心思想,為高性能、高可靠性的 Java 應用開發奠定基礎 ?。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91321.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軌物方案】當補貼退潮,光伏電站如何回歸價值本質?

中國光伏產業正站在一個歷史性的拐點。過去&#xff0c;國家補貼的“黃金時代”催生了裝機量的爆發式增長&#xff0c;許多電站在建設初期將重心放在了快速并網&#xff0c;卻忽視了貫穿2-30年生命周期的運維規劃。如今&#xff0c;補貼浪潮逐漸退去&#xff0c;各大企業開始從…

群暉Nas - Docker(ContainerManager)上安裝SVN Server和庫權限設置問題

上次安裝了Gitlab&#xff0c;可以參考這篇&#xff08;群暉Nas - Docker&#xff08;ContainerManager&#xff09;上安裝GitLab&#xff09;&#xff0c;今天來搞SVN服務器&#xff0c;廢話不多說。 下載鏡像 還是先下載鏡像&#xff08;garethflowers/svn-server&#xff…

前端打包自動壓縮為zip--archiver

安裝依賴 pnpm add archiver types/archiver/vitePlugins/autoBuildZip.ts import { Plugin } from vite; import archiver from archiver; import fs from fs;const compressFolder (folderPath: string, outputFilePath: string) > {const output fs.createWriteStream(…

React響應式組件范式:從類組件到Hooks

?引言 在UI開發中&#xff0c;"狀態變化自動觸發UI更新"的響應式機制是構建動態界面的核心。React通過獨特的??單向數據流??和??虛擬DOM&#xff08;Virtual DOM&#xff09;?? 實現這一目標&#xff0c;但類組件&#xff08;Class Components&#xff09;…

com2tcp工具

com2tcp 是 com0com 套件中的一個實用工具&#xff0c;用于將本地串口&#xff08;COM&#xff09;數據轉發到 TCP/IP 網絡&#xff0c;或者將 TCP/IP 數據轉發到本地串口&#xff0c;實現串口數據的網絡透傳。 1. com2tcp 基本用法 &#xff08;1&#xff09;安裝 com0com 從…

MySQL實操:將Word表格數據導入MySQL表

文章目錄 1. 提出任務1.1 Word表格數據1.2 查看商品空表1.3 任務要求2. 完成任務2.1 借助AI2.1.1 利用AI生成SQL語句2.1.2 在Navicat里執行查詢2.1.3 查看商品表記錄2.2 借助Excel2.2.1 將Word表格數據復制到Excel2.2.2 新建商品表2.2.3 利用導入向導將電子表格數據導入商品表2…

什么是Podman?能否替代Docker?Podman快速入門

什么是PodmanPodman&#xff08;POD Manager&#xff09;是一個開源的無守護進程&#xff08;daemonless&#xff09;容器引擎&#xff0c;用于管理容器、容器鏡像、容器卷和網絡。它兼容 OCI 標準&#xff0c;可以運行 Docker 鏡像&#xff0c;并且設計上與 Docker CLI 命令高…

開通保存圖片權限

直接粘貼就可以用 上干貨 可以的話希望點個start/* 小程序特有相關 */mp-weixin: {appid: VITE_WX_APPID,setting: {urlCheck: false,minified : true //是否壓縮js},usingComponents: true,"lazyCodeLoading": "requiredComponents", //按需注入"pe…

【趙渝強老師】大數據交換引擎Sqoop

Sqoop是SQL To Hadoop的簡稱&#xff0c;它是一款開源的工具&#xff0c;主要用于在Hadoop&#xff08;Hive&#xff09;與傳統的數據庫&#xff08;Oracle、MySQL等&#xff09;間進行數據的傳遞。通過使用Sqoop可以將一個關系型數據庫中的數據導進到Hadoop的HDFS中&#xff0…

C++進階-map的應用

目錄 1.預備知識 2.map的補充知識 2.1map的插入方式 2.2訪問鍵和值 2.3map::operator[]的補充 2.4另外一些map的成員函數的補充 3.map的應用實踐-力扣刷題-前k個高頻單詞 3.1解法1 3.2解法2 3.3解法3 4.map的應用實踐-力扣刷題-隨機鏈表的復制 4.1C語言解法 4.2C解…

【三維重建工具】NeRFStudio、3D GaussianSplatting、Colmap安裝與使用指南

目錄 一、NeRFStudio安裝1.安裝&#xff08;ubuntu系統&#xff09;2.安裝&#xff08;windows系統&#xff09; 二、安裝tinycudann三、Colmap安裝與使用1. 安裝依賴2. 安裝colmap3.使用colmap3.1 可視化界面使用3.2 Nerfstudio命令行調用Colmap3.3 colmap結果不準時的修復3.4…

Mybatis05-動態sql

一、應用場景MyBatis 的 動態 SQL 是指根據不同的條件動態拼接生成 SQL 語句的能力。它的最大優勢是&#xff1a;避免寫多個 XML 映射語句、避免 SQL 冗余、提升代碼復用性和可維護性。示例1&#xff1a;用戶可以通過勾選框&#xff0c;勾選不同的數據進行批量刪除&#xff0c;…

VSCODE 選中多行 需要同時按住alt鍵才可以

在 VS Code 中&#xff0c;如果你發現 必須按住 Alt 鍵才能選中多行&#xff08;即“列選擇”或“塊選擇”模式&#xff09;&#xff0c;而直接拖動鼠標無法多選&#xff0c;可能是由于以下原因導致的&#xff1a;1. 檢查是否啟用了“列選擇模式”VS Code 默認情況下&#xff1…

2025前端面試真題以及答案-不斷整理中,問題來源于牛客真題

一、 項目內存泄露react與vue的渲染機制有哪些不同react fiber架構vue2與3&#xff0c;為什么用proxy代替defineproperty性能優化有哪些三欄布局實現方式重排與重繪一個對話聊天框如何減少重排&#xff08;我回答的是絕對定位&#xff0c;將聊天框定位在下面&#xff0c;類似于…

雷軍的 IP 革命:人格化力量如何重塑商業規則|創客匠人

小米 YU7 發布會 3 分鐘售罄 20 萬臺的奇跡&#xff0c;撕開了一個時代真相&#xff1a;當商業競爭進入深水區&#xff0c;決定勝負的不再是產品參數&#xff0c;而是創始人 IP 的人格穿透力。雷軍僅憑個人影響力撬動數十億級交易&#xff0c;這絕非偶然&#xff0c;而是人格化…

SpringBoot3:應對C10K并發挑戰的優化指南

嘿&#xff0c;哥們&#xff01;還在為服務的并發量上不去而頭疼嗎&#xff1f;用戶量一上來&#xff0c;CPU、內存就告急&#xff0c;接口響應慢得像蝸牛&#xff1f;別慌&#xff0c;今天我們就來盤一盤&#xff0c;怎么用最新的Spring Boot 3&#xff0c;把服務性能調教到極…

響應式編程入門教程第三節:ReactiveCommand 與 UI 交互

響應式編程入門教程第一節&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來&#xff01; 響應式編程入門教程第二節&#xff1a;構建 ObservableProperty&#xff1c;T&#xff1e; — 封裝 ReactiveProperty 的高級用法 響應式編程入門教程第三節&#x…

500+技術棧覆蓋:Web測試平臺TestComplete的對象識別技術解析

在用戶界面&#xff08;UI&#xff09;測試領域&#xff0c;傳統的測試工具往往依賴于XPath或CSS選擇器來定位頁面元素。然而&#xff0c;在面對動態變化的界面、多語言支持或是跨越多種技術框架的應用時&#xff0c;這些傳統方法常導致腳本失效&#xff0c;增加了維護成本。 …

研究人員利用提示注入漏洞繞過Meta的Llama防火墻防護

Trendyol應用安全團隊發現了一系列繞過技術&#xff0c;使得Meta的Llama防火墻在面對復雜的提示注入攻擊時防護失效。這一發現引發了人們對現有大語言模型&#xff08;LLM&#xff09;安全措施準備情況的擔憂&#xff0c;并凸顯出在企業日益將大語言模型嵌入工作流程時&#xf…

Shell 腳本系統學習 · 第5篇:多命令順序執行的三種方式詳解(`;`、``、`||`)

在日常的 Linux 運維與腳本編寫中&#xff0c;我們經常需要依次執行多條命令。本篇將帶你徹底搞懂三種命令順序執行方式&#xff1a;;、&& 和 ||&#xff0c;并通過實用示例掌握它們的區別與應用場景。一、為什么要了解多命令執行方式&#xff1f; 在實際運維或腳本編寫…