FileInputStream 詳解與記憶方法

FileInputStream 詳解與記憶方法

一、FileInputStream 核心概念

FileInputStream?是 Java 中用于從文件讀取原始字節的類,繼承自?InputStream?抽象類。

1. 核心特點

特性說明
繼承關系InputStream?→?FileInputStream
數據單位字節(8bit)
用途讀取二進制文件(如圖片、音頻、PDF等)
是否緩沖默認無緩沖(需配合?BufferedInputStream?使用)
線程安全

2. 構造方法

java

// 1. 通過文件路徑創建
FileInputStream fis = new FileInputStream("test.txt");// 2. 通過File對象創建
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);// 3. 通過文件描述符創建(高級用法)
FileDescriptor fd = new FileDescriptor();
FileInputStream fis = new FileInputStream(fd);

3. 核心方法

方法作用
int read()讀取單個字節(返回0-255,-1表示結束),調用一次read()方法則讀取一個字節,返回讀到的字節本身。(例如,信息為a,則返回一個97),如果讀不到任何數據則返回-1
int read(byte[] b)讀取字節到數組,返回實際讀取的字節數(一次最多讀取到b.length個字節)
int read(byte[] b, int off, int len)從偏移量off開始讀取len個字節到數組
long skip(long n)跳過n個字節
void close()關閉流
FileChannel getChannel()獲取關聯的FileChannel(NIO相關)
int? ? available()? ? ?返回預估計流當中剩余的字節數量(意思就是:還剩下幾個字節沒有讀取)

二、使用示例

1. 基礎讀取文件

java

try (FileInputStream fis = new FileInputStream("data.bin")) {int data;while ((data = fis.read()) != -1) {  // 每次讀取1字節System.out.print((char) data);   // 轉為字符輸出(僅適用于文本)}
} // try-with-resources自動關閉流

2. 高效讀取(緩沖區)

java

try (FileInputStream fis = new FileInputStream("largefile.bin");BufferedInputStream bis = new BufferedInputStream(fis)) { // 添加緩沖byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {// 處理buffer中的數據}
}

3. 讀取到字節數組

java

File file = new File("data.bin");
byte[] fileData = new byte[(int) file.length()];
try (FileInputStream fis = new FileInputStream(file)) {fis.read(fileData); // 一次性讀取全部內容
}

三、記憶技巧

1. 名稱解析法

"File + Input + Stream"

  • File:操作文件

  • Input:輸入(讀取)

  • Stream:字節流

2. 對比記憶法

對比類方向數據單位典型用途
FileInputStream讀取字節圖片、壓縮包等二進制文件
FileOutputStream寫入字節文件下載、數據存儲
FileReader讀取字符文本文件(自動處理編碼)

3. 使用場景聯想

  • 圖片處理FileInputStream?+?ImageIO.read()

  • 文件復制FileInputStream?+?FileOutputStream

  • 加密解密:讀取原始字節后進行加密運算

4. 常見誤區提醒

??錯誤用法:直接讀取文本文件(可能亂碼)
??正確做法:文本文件應使用?FileReader?或?InputStreamReader


四、面試高頻問題

1. FileInputStream 和 BufferedInputStream 的區別?

  • FileInputStream:每次read()直接訪問磁盤,性能低

  • BufferedInputStream:內置緩沖區(默認8KB),減少磁盤IO次數

2. 為什么讀取文件要用 try-with-resources?

  • 自動關閉資源:避免忘記調用close()導致文件句柄泄漏

  • 代碼簡潔:不需要手動寫finally

3. 如何高效讀取大文件?

java

// 方案1:使用緩沖流
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("large.bin"))) {byte[] buffer = new byte[8192];  // 8KB緩沖區while (bis.read(buffer) != -1) {// 處理數據}
}// 方案2:使用NIO的FileChannel(超大文件更高效)

4. read() 方法返回值的含義?

  • 返回int:0-255表示字節值,-1表示文件結束

  • 注意:必須用int接收,byte會無法區分-1和255


五、總結圖示

mermaid

flowchart TDA[FileInputStream] --> B[讀取二進制文件]A --> C[核心方法: read/skip/close]A --> D[需配合緩沖流提升性能]B --> E[圖片/音頻/PDF等]D --> F[BufferedInputStream]

一句話總結
"FileInputStream讀字節,無緩沖性能低,文本文件別用它,記得關閉保安全"

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

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

相關文章

設計模式 四、行為設計模式(2)

五、狀態模式 1、概述 狀態設計模式是一種行為型設計模式,它允許對象在其內部狀態發生時改變其行為,這種模式可以消除大量的條件語句,并將每個狀態的行為封裝到單獨的類中。 狀態模式的主要組成部分如下: 1)上…

大模型學習八:?Sealos 私有化部署之VMware 安裝ubuntu22.04 虛擬機安裝(實操)

一、說明 windows 11 ubuntu22.04.5 安裝5個虛擬機,3個master 2個node 二、安裝 Vmware 17(沒成功,但你可以成功) 我的電腦配置比較舊,直接提示處理器不支持xsave 無法打開虛擬機的電源,網上方法試過了…

Win32++ 使用初探

文章目錄 1. 環境要求2. Win32安裝3. 項目創建3.1 項目創建(1)直接使用Win32里的示例Sample(2)自行創建項目 最近想用 VC寫些 UI,但又不太想用 MFC,正好對界面要求不太高,就使用了一下 Win3…

R 語言科研繪圖第 38 期 --- 餅狀圖-玫瑰

在發表科研論文的過程中,科研繪圖是必不可少的,一張好看的圖形會是文章很大的加分項。 為了便于使用,本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中,獲取方式: R 語言科研繪圖模板 --- sciRplothttps://mp.…

Linux驅動開發進階(六)- 多線程與并發

文章目錄 1、前言2、進程與線程3、內核線程4、底半步機制4.1、軟中斷4.2、tasklet4.3、工作隊列4.3.1、普通工作項4.3.2、延時工作項4.3.3、工作隊列 5、中斷線程化6、進程6.1、內核進程6.2、用戶空間進程 7、鎖機制7.1、原子操作7.2、自旋鎖7.3、信號量7.4、互斥鎖7.5、comple…

第四節:React Hooks進階篇-useEffect依賴項為空數組[]與不寫的區別

陷阱題:閉包問題、Stale Closure舉例 一、依賴項為空數組[]與不寫的核心區別 行為空數組[]不寫依賴項執行時機僅在組件掛載時執行一次(類似componentDidMount)組件每次渲染后都執行(類似componentDidUpdate)更新觸發…

【第39節】windows編程:打造MFC版本任務管理器

目錄 一、項目概述 二、項目開發的各種功能關鍵 2.1 進程信息的獲取 2.2 線程信息的獲取 2.3 進程模塊信息的獲取 2.3.1 模塊快照 2.3.2 枚舉模塊 2.4 進程堆信息的獲取 2.5 窗口信息的獲取 2.6 文件信息的獲取 2.7 內存信息和CPU占用率的獲取 2.7.1 內存信息相關結…

計算軸承|滾動軸承故障頻率

一、軸承故障頻率概述 在旋轉機械故障診斷中,軸承故障頻率(BPFO、BPFI、BSF、FTF)是重要的分析依據。通過計算這些特征頻率,可以幫助工程師: 識別軸承故障類型(內圈/外圈/滾動體故障)制定振動…

【數據結構與算法】ArrayList 和 順序表

文章目錄 🌲List🌲1. 線性表🌲2. 順序表🌿2.1 MyArrayList2.1.1 類中重寫所有接口方法1.新增元素2.在pos位置新增元素(指定位置)3.判定是否包含了某個特定元素 4.查找特定元素對應的位置 5.獲取pos下標的元素 6.給pos位置的元素替…

OceanBase 推出單機版 ,為中小規模業務提供高性價比方案

近日,OceanBase正式推出了全新的單機版數據庫。這款產品基于OceanBase自主研發的單機分布式一體化架構,具有精簡的架構設計和出色的兼容性,能夠為中小規模業務場景提供高性價比的數據庫解決方案,充分滿足客戶在不同業務規模下的多…

如何在 Vue 3 中實現百度地圖位置選擇器組件

如何在 Vue 3 中實現百度地圖位置選擇器組件 前言 在開發前端應用時,地圖選擇器是一個非常常見的需求。尤其是在一些需要用戶選擇地址的場景,如電商平臺、旅游網站、酒店預定等,百度地圖組件能提供準確的地理位置服務。在本文中&#xff0c…

Python中如何用正則表達式精準匹配IP地址?

在網絡編程和數據處理時,我們經常需要從文本中提取或驗證IP地址。Python的正則表達式(re模塊)是完成這個任務的利器。但你知道怎么寫才能準確匹配各種合法的IP地址嗎?今天我們就來詳細探討這個問題。 為什么需要IP正則表達式? 假設你正在分…

spring--聲明式事務

聲明式事務 1、回顧事務 要么都成功,要么都失敗! 事務在項目開發中,十分重要,涉及數據的一致性問題 確保完整性和一致性 事務ACID: 原子性:事務是原子性操作,由一系列動作組成,…

Kotlin 學習-集合

/*** kotlin 集合* List:是一個有序列表,可通過索引(下標)訪問元素。元素可以在list中出現多次、元素可重復* Set:是元素唯一的集合。一般來說 set中的元素順序并不重要、無序集合* Map:(字典)是一組鍵值對。鍵是唯一的…

WPF 五子棋項目文檔

WPF 五子棋項目文檔 1. 項目概述 本項目是一個使用 Windows Presentation Foundation (WPF) 技術棧和 C# 語言實現的桌面版五子棋(Gomoku)游戲。它遵循 MVVM(Model-View-ViewModel)設計模式,旨在提供一個結構清晰、可…

計算機操作系統——死鎖(詳細解釋和處理死鎖)

系列文章目錄 計算機操作系統-計算機系統中的死鎖 文章目錄 系列文章目錄前言一、資源問題: 計算機系統當中的死鎖: 二、死鎖的定義、必要條件和處理方法: 1.死鎖的定義:2.產生死鎖的必要條件:3.處理死鎖的方法&#…

Springboot項目正常啟動,訪問資源卻出現404錯誤如何解決?

我在自己的springboot項目中的啟動類上同時使用了SprinBootApplication和ComponentScan注解, 雖然項目能夠正常啟動,但是訪問資源后,返回404錯誤,隨后在啟動類中輸出bean,發現controller創建失敗: 而后我將ComponentScan去掉后資源就能訪問到了. 原因 SprinBootApplication本身…

第十五屆藍橋杯C/C++B組省賽真題講解(分享去年比賽的一些真實感受)

試題A——握手問題 一、解題思路 直接用高中學的排列組合思路 二、代碼示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

動態規劃(6)——01背包問題

歡迎來到博主的專欄&#xff1a;算法解析 博主ID&#xff1a;代碼小號 文章目錄 牛客網——【模板】01背包題目解析題目1算法原理題目1題解代碼。問題2算法原理問題2題解代碼01背包問題的滾動數組優化 牛客網——【模板】01背包 題目解析 關于I/O相關的東西博主就不多贅述了&a…

TQTT_KU5P開發板教程---實現流水燈

文檔實現功能介紹 本文檔是學習本開發板的基礎&#xff0c;通過設置計數器使led0到led7依次閃爍&#xff0c;讓用戶初步認識vivado基本的開發流程以及熟悉項目的創建。本開發板的所有教程所使用的軟件都是vivado2024.1版本的。可以根據網上的教程下載與安裝。 硬件資源 此次教程…