系列文章目錄
?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 | 處理二進制數據(圖片、視頻、壓縮包等) | FileInputStream 、ByteArrayInputStream |
?字符流 | Reader /Writer | 處理文本數據(.txt 、.csv 等) | FileReader, StringWriter |
? ? ?節點流和處理流:
? 節點流可以從一個特定的數據元讀寫數據。而處理流(也叫包裝流)是“連接”已存在的流(節點流或處理流),為程序提供更為強大的讀寫功能。(更加靈活。)
? ? 我們這里詳細的解釋一下底層處理流:
? ? ? ? ?這其實屬于一種處理模式:修飾器模式(Decorator Pattern)??是一種關鍵設計模式,它通過動態組合對象的方式,為I/O流提供靈活的功能擴展能力,同時避免因繼承導致的類爆炸問題。
修飾器模式的核心作用
-
?動態擴展功能
在不修改原有類的基礎上,通過嵌套包裝(Wrapping)?的方式,為I/O流動態添加新功能(如緩沖、壓縮、加密等)。 -
?避免類爆炸
如果通過繼承實現所有功能組合(如緩沖+壓縮+加密),需要為每個組合創建子類,導致類數量指數級增長。修飾器模式通過組合替代繼承,僅需少量類即可覆蓋所有功能組合。 -
?保持接口一致性
所有修飾器類(如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流的分類,接下來一篇我會給大家講講流的體系結構,以其它們是如何使用的,謝謝大家,我會持續更新的。