Java 文件和IO流基礎(生動形象版)

系列文章目錄

?Java文件和IO流基礎部分


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 文件VSIO流

文章目錄

  • 系列文章目錄
  • 前言
  • 一、文件的定義和理解:

? ? ? ? ? ? ? ? 1.專業定義:

? ? ? ? ? ? ? ? ?2.文件系統和路徑:

  • 二、IO流的定義和分類
    • 1.定義:
    • 2.流的分類:
    • 修飾器模式的核心作用:
    • 基礎結構:
  • 總結


前言

? ? 在我們學習了前面的Java操作后,我們目前需要靈活的對文件進行靈活的操作,學習IO流是編程中的基礎與核心技能,幾乎所有的應用程序都涉及數據輸入輸出(I/O)操作。其實就是數據交互的一種方式,下面讓我們詳細的學習一下。


一、文件的定義與理解:

? ? 首先我先談談我對文件的理解。文件是保存數據的地方,比如大家經常使用的word文檔,txt文件,excel文件,都是文件,它既可以保存一張圖片,也可以保存視頻和聲音。

? ? 專業定義

? 計算機文件是以計算機硬盤,光盤以及移動存儲設備為載體的存儲在計算機上的信息集合,其存儲形式可以是文本文檔,圖片和程序等。文件通常具有文件擴展名,用于指示文件類型,例如,圖片文件擴展名為jpg,文本文件擴展名是txt等。

? ?文件系統和路徑:

? ? 一個文件系統可以包含三類對象:文件,目錄和符號鏈接。當今流行的操作系統都支持文件和目錄,并且允許目錄中包含子目錄,處于目錄樹中最頂部的目錄稱為“根目錄”。Linux和UNIX操作系統只有一個根目錄/;而windows操作系統可以有多個根目錄,例如“c:\”“d:\”等

? ? 文件系統中的對象可以使用一條路徑作為唯一的識別,例如,windows系統C盤下的User目錄可以表示成“C:\Users”。

? ? ?路徑有絕對路徑和相對路徑兩種:

? ? ?絕對路徑-------從根路徑開始,對文件進行完整描述,例如,“D:\data\qst.txt”。

? ? ?相對路徑-------從當前路徑為參照,對文件進行描述,例如,“data\qst.txt”。

二、IO流的定義和分類:

1.定義:

? ? ?Java的IO流是實現數據輸入(Input)和輸出(Output)的基礎,可以對數據實現讀/寫操作。流的優勢在于使用統一的方式對數據進行操作或傳遞,簡化了代碼的操作。

? ? ? ? ?

形象的理解:

? ? ?可以把兩端當成一個用戶和物流中心,中間的就是外賣小哥,來回兩個過程。

2.流的分類:

? ? 按流的流向來分:

? 輸入流:只能從輸入流中讀取數據,而不能向輸入流中寫入數據;

? 輸出流:只能向輸出流中寫入數據,而不能從輸出流中讀取數據;

? ?按照流所操作的基本數據單元來分,可將流分為字節流和字符流。

? ? ??

核心區別在于處理數據的基本單位字節還是字符

?分類?基類?適用場景?典型實現類
?字節流InputStream/OutputStream處理二進制數據(圖片、視頻、壓縮包等)FileInputStreamByteArrayInputStream
?字符流Reader/Writer處理文本數據(.txt.csv等)FileReader,StringWriter

? ? ?節點流和處理流:

? 節點流可以從一個特定的數據元讀寫數據。而處理流(也叫包裝流)是“連接”已存在的流(節點流或處理流),為程序提供更為強大的讀寫功能。(更加靈活。)

? ? 我們這里詳細的解釋一下底層處理流:

? ? ? ? ?這其實屬于一種處理模式:修飾器模式(Decorator Pattern)??是一種關鍵設計模式,它通過動態組合對象的方式,為I/O流提供靈活的功能擴展能力,同時避免因繼承導致的類爆炸問題。

修飾器模式的核心作用

  1. ?動態擴展功能
    在不修改原有類的基礎上,通過嵌套包裝(Wrapping)?的方式,為I/O流動態添加新功能(如緩沖、壓縮、加密等)。

  2. ?避免類爆炸
    如果通過繼承實現所有功能組合(如緩沖+壓縮+加密),需要為每個組合創建子類,導致類數量指數級增長。修飾器模式通過組合替代繼承,僅需少量類即可覆蓋所有功能組合。

  3. ?保持接口一致性
    所有修飾器類(如BufferedInputStream)與基礎流類(如FileInputStream)實現相同的接口(如InputStream),使嵌套調用透明化。

? ? ? 修飾器模式在Java I/O中的實現

?? ??基礎結構:
  • ?抽象組件(Component)?:定義核心功能接口,如InputStream/OutputStream
  • ?具體組件(Concrete Component)?:實現基礎功能,如FileInputStream(讀取文件)。
  • ?修飾器抽象類(Decorator)?:繼承自Component并持有Component的引用,如FilterInputStream
  • ?具體修飾器(Concrete Decorator)?:添加具體功能,如BufferedInputStream(緩沖功能)。

? ? ?

// 基礎組件:InputStream(抽象接口)
public abstract class InputStream {public abstract int read() throws IOException;
}// 具體組件:FileInputStream(基礎文件流)
public class FileInputStream extends InputStream {public int read() { /* 從文件讀取字節 */ }
}// 修飾器抽象類:FilterInputStream(所有修飾器的基類)
public class FilterInputStream extends InputStream {protected InputStream in;  // 持有被修飾的流對象protected FilterInputStream(InputStream in) { this.in = in; }public int read() throws IOException { return in.read();  // 默認直接調用被修飾流的方法}
}// 具體修飾器:BufferedInputStream(添加緩沖功能)
public class BufferedInputStream extends FilterInputStream {private byte[] buffer = new byte[8192];private int pos;public BufferedInputStream(InputStream in) { super(in); }@Overridepublic int read() throws IOException {if (pos >= buffer.length) {// 從底層流批量讀取數據到緩沖區int bytesRead = in.read(buffer);if (bytesRead <= 0) return -1;pos = 0;}return buffer[pos++];  // 從緩沖區返回單個字節}
}

? 這其實就是一種疊加的模式,你能理解吧,以下這個代碼就是給大家詳細說明一下:

? ? ? ?

// 基礎流:讀取文件
InputStream baseStream = new FileInputStream("data.txt");// 添加緩沖功能
InputStream bufferedStream = new BufferedInputStream(baseStream);// 再添加解壓縮功能(假設GZIPInputStream是另一個修飾器)
InputStream gzipStream = new GZIPInputStream(bufferedStream);// 最終使用:依次調用緩沖→解壓→文件讀取
int data = gzipStream.read();

? ? ?


總結

以上就是今天要講的內容,本文僅僅講了文件和IO流的分類,接下來一篇我會給大家講講流的體系結構,以其它們是如何使用的,謝謝大家,我會持續更新的。

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

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

相關文章

Linux驅動學習筆記(四)

高級字符設備進階 1.一個完整的IO過程包含以下幾個步驟&#xff1a;1應用程序向操作系統發起IO調用請求(系統調用)&#xff1b;2操作系統準備數據&#xff0c;把IO設備的數據加載到內核緩沖區&#xff1b;3操作系統拷貝數據&#xff0c;把內核緩沖區的數據從內核空間拷貝到應用…

el-table的行向上移動向下移動,刪除選定行

<template><el-table :data"tableData" border style"width: 100%"><!-- 其他列 --><el-table-column label"ID"><template slot-scope"scope">{{ scope.$index }}</template></el-table-colu…

人工智能之數學基礎:矩陣的降維

本文重點 在現實世界中,我們經常會遇到高維數據。例如,圖像數據通常具有很高的維度,每個像素點都可以看作是一個維度。高維數據不僅會帶來計算和存儲上的困難,還可能會導致 “維數災難”,即隨著維度的增加,數據的稀疏性和噪聲也會增加,從而影響數據分析的效果。因此,我…

2025年,電腦還需要分區嗎?

隨著2025年的到來&#xff0c;電腦存儲空間已經不像以前那么金貴&#xff0c;固態硬盤&#xff08;SSD&#xff09;容量更大、速度更快&#xff0c;云存儲也成了日常標配。許多人開始質疑&#xff1a;電腦還需要像以前那樣分區嗎&#xff1f; 一、分區到底是什么意思&#xff…

Springboot項目集成maven-assembly-plugin進行打包

通常我們將應用部署到服務器的某個目錄下&#xff0c;一般情況下我們會提供像target&#xff08;存放應用jar包&#xff09;&#xff0c;bin&#xff08;項目啟動/停止腳本&#xff09;&#xff0c;config&#xff08;項目配置文件&#xff09;&#xff0c;logs&#xff08;項目…

CSS3 基礎布局技術與響應式設計

1. CSS3 基礎與布局技術 1.1 Flexbox 布局 Flexbox 是一種一維布局模型&#xff0c;適合用于在一個方向上&#xff08;行或列&#xff09;排列元素。 基本概念&#xff1a; 容器&#xff08;Container&#xff09;&#xff1a;應用 display: flex; 的元素。項目&#xff08…

鴻蒙NEXT項目實戰-百得知識庫01

代碼倉地址&#xff0c;大家記得點個star IbestKnowTeach: 百得知識庫基于鴻蒙NEXT穩定版實現的一款企業級開發項目案例。 本案例涉及到多個鴻蒙相關技術知識點&#xff1a; 1、布局 2、配置文件 3、組件的封裝和使用 4、路由的使用 5、請求響應攔截器的封裝 6、位置服務 7、三…

【DeepSeek應用】本地部署deepseek模型后,如何在vscode中調用該模型進行代碼撰寫,檢視和優化?

若已成功在本地部署了 DeepSeek 模型(例如通過 vscode-llm、ollama 或私有 API 服務),在 VS Code 中調用本地模型進行代碼撰寫、檢視和優化的完整流程如下: 1. 準備工作:確認本地模型服務狀態 模型服務類型: 若使用 HTTP API 服務(如 FastAPI/Flask 封裝),假設服務地址…

jenkins 配置郵件問題整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自帶的&#xff0c; B.安裝功能強大的插件 配置流程&#xff1a; 1. jenkins->系統配置->Jenkins Location 此處的”系統管理員郵件地址“&#xff0c;是配置之后發件人的email。 2.配置系統自帶的郵件A…

Android Coil3階梯preload批量Bitmap拼接扁平寬圖,Kotlin

Android Coil3階梯preload批量Bitmap拼接扁平寬圖&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-p…

C++基礎 [八] - list的使用與模擬實現

目錄 list的介紹 List的迭代器失效問題 List中sort的效率測試 list 容器的模擬實現思想 模塊分析 作用分析 list_node類設計 list 的迭代器類設計 迭代器類--存在的意義 迭代器類--模擬實現 模板參數 和 成員變量 構造函數 * 運算符的重載 運算符的重載 -- 運…

【系統架構設計師】操作系統 - 特殊操作系統 ③ ( 微內核操作系統 | 單體內核 操作系統 | 內核態 | 用戶態 | 單體內核 與 微內核 對比 )

文章目錄 一、微內核操作系統1、單體內核 操作系統2、微內核操作系統 引入3、微內核操作系統 概念4、微內核操作系統 案例 二、單體內核 與 微內核 對比1、功能對比2、單體內核 優缺點3、微內核 優缺點 一、微內核操作系統 1、單體內核 操作系統 單體內核 操作系統 工作狀態 : …

系統思考:惡性循環

去年&#xff0c;我給一家知名人力資源公司交付了兩個項目——一個在6月&#xff0c;另一個在8月&#xff0c;至今半年多了依然沒有收到課酬。催促多次&#xff0c;得到的答復卻各式各樣&#xff1a;銷售說老板卡了額度&#xff0c;老板說具體情況還需了解。每一次的推諉&#…

基于springboot的房屋租賃系統(008)

摘 要 社會的發展和科學技術的進步&#xff0c;互聯網技術越來越受歡迎。網絡計算機的生活方式逐漸受到廣大人民群眾的喜愛&#xff0c;也逐漸進入了每個用戶的使用。互聯網具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等優點。 因此&#xff0c;構建符…

視頻翻譯器免費哪個好?輕松玩轉視頻直播翻譯

你是不是覺得看外語視頻很麻煩&#xff1f;每次遇到喜歡的外語電影、電視劇或動漫&#xff0c;總是要等字幕組的翻譯&#xff0c;或者因為語言不通而錯過精彩的情節。 這個時候&#xff0c;掌握多語種直播翻譯方案就顯得尤為重要&#xff0c;有了實時字幕&#xff0c;看外語視…

在cherry studio中使用MCP——本地文件管理FileSystem

cherry studio是一款開源的AI助手工具&#xff0c;可以便捷地利用API訪問各種LLM&#xff0c;有關cherry studio的使用這里不再多說&#xff0c;可以參考這篇文章https://blog.csdn.net/m0_65494437/article/details/145478823 官網&#xff1a;https://cherry-ai.com/ MCP是什…

從點燈開始的51單片機生活

陵谷紛紜新事改&#xff0c;筑臺土石未應遲。 目錄 sfr與sbit&#xff1f;不靠定時器的delay_ms延時函數所謂寄存器 sfr與sbit&#xff1f; 這第一課咱們主要來先理解一下sfr與sbit&#xff0c;以下可能是咱們這些新手朋友常見的點燈代碼&#xff1a; #include<regx52.h&g…

Django系列教程(13)——Cookie和Session應用場景及案例

目錄 什么是cookie&#xff0c;cookie的應用場景及缺點 Django中如何使用cookie Cookie使用示例 什么是session及session的工作原理 Django中如何使用會話session Session使用示例 小結 HTTP協議本身是”無狀態”的&#xff0c;在一次請求和下一次請求之間沒有任何狀態保…

c++類和對象(下篇)下

下面就來補充一下c雷和對象最后一點內容. 首先先補充一下上一篇博客上c類和對象(下篇)上-CSDN博客最后學習的靜態成員變量的小練習求123...n_牛客題霸_牛客網 (nowcoder.com)下面就是題解.靈活的運用了靜態成員變量不銷毀的特點,建立數組利用構造函數來完成n次相加. class A{ …

《TCP/IP網絡編程》學習筆記 | Chapter 19:Windows 平臺下線程的使用

《TCP/IP網絡編程》學習筆記 | Chapter 19&#xff1a;Windows 平臺下線程的使用 《TCP/IP網絡編程》學習筆記 | Chapter 19&#xff1a;Windows 平臺下線程的使用內核對象內核對象的定義內核對象歸操作系統所有 基于 Windows 的線程創建進程與線程的關系Windows 中線程的創建方…