Java中FileInputStream的read()方法代碼示例詳解
我發(fā)現(xiàn)java中的FileInputStream的read()方法,通過字節(jié)數(shù)組讀取和字節(jié)讀取,一個(gè)是返回讀取字節(jié)的長度,一個(gè)是返回字節(jié)代表的值。
這是 FileInputStream 兩個(gè) read() 方法的核心區(qū)別,直接決定了使用場景:
兩個(gè)read()方法對比
| 方法簽名 | 返回值 | 作用 | 使用場景 |
|---|---|---|---|
int read() | 0-255 的字節(jié)值,或 -1(文件結(jié)束) | 逐字節(jié)讀取 | 小文件、簡單演示、需要逐字節(jié)處理 |
int read(byte[] b) | 實(shí)際讀取的字節(jié)數(shù)(0 到 b.length),或 -1(文件結(jié)束) | 批量讀取到緩沖區(qū) | 大文件、高效處理、網(wǎng)絡(luò)傳輸 |
代碼示例對比
1. 逐字節(jié)讀?。ǚ祷刈止?jié)值)
FileInputStream fis = new FileInputStream("test.txt");
int data; // 注意是 int,不是 byte!
while ((data = fis.read()) != -1) {
// data 是 0-255 的字節(jié)值,或 -1 表示結(jié)束
System.out.print((char) data); // 轉(zhuǎn)為字符顯示
}
fis.close();關(guān)鍵點(diǎn):
- 返回值
int是為了兼容 -1(byte范圍是 -128~127,無法表示 -1) - 每次只讀 1 個(gè)字節(jié),效率極低
2. 批量讀?。ǚ祷刈x取長度)
FileInputStream fis = new FileInputStream("test.txt");
byte[] buffer = new byte[1024]; // 1KB 緩沖區(qū)
int bytesRead; // 實(shí)際讀到的字節(jié)數(shù)
while ((bytesRead = fis.read(buffer)) != -1) {
// bytesRead 告訴本次讀了多少字節(jié)(可能 < 1024)
String chunk = new String(buffer, 0, bytesRead, "UTF-8");
System.out.print(chunk);
}
fis.close();關(guān)鍵點(diǎn):
buffer是"容器",方法把數(shù)據(jù)填充進(jìn)去bytesRead告訴你實(shí)際裝了多少(最后一次可能不滿)- 必須用
new String(buffer, 0, bytesRead),不能用全部 buffer,否則末尾有垃圾數(shù)據(jù)
為什么這樣設(shè)計(jì)?
| 設(shè)計(jì)原因 | 解釋 |
|---|---|
| 逐字節(jié)返回 int | 需要區(qū)分 0-255 的有效字節(jié) 和 -1 的結(jié)束標(biāo)志,byte 無法做到 |
| 批量返回長度 | 數(shù)組已經(jīng)裝了數(shù)據(jù),只需告訴"裝了多少",避免重復(fù)拷貝 |
| 減少系統(tǒng)調(diào)用 | 批量讀一次磁盤,比逐字節(jié)讀 1024 次快 100 倍以上 |
常見錯(cuò)誤
// ? 錯(cuò)誤:忽略 bytesRead,直接用整個(gè) buffer
while (fis.read(buffer) != -1) {
String s = new String(buffer); // 末尾可能有上次殘留的垃圾!
}
// ? 正確:只用讀到的前 bytesRead 個(gè)字節(jié)
while ((bytesRead = fis.read(buffer)) != -1) {
String s = new String(buffer, 0, bytesRead, "UTF-8");
}一句話總結(jié)
read()→ “給我一個(gè)字節(jié)”,返回那個(gè)字節(jié)的值(或 -1 結(jié)束)read(byte[])→ “給我一堆字節(jié),裝這個(gè)數(shù)組里”,返回裝了多少個(gè)(或 -1 結(jié)束)
批量讀是生產(chǎn)環(huán)境唯一選擇,逐字節(jié)讀只用來學(xué)習(xí)原理或處理極小文件。
到此這篇關(guān)于Java中FileInputStream的read()方法代碼示例詳解的文章就介紹到這了,更多相關(guān)java fileInputstream的read()方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springcloud-eureka注冊時(shí)的ip問題
這篇文章主要介紹了解決springcloud-eureka注冊時(shí)的ip問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java使用Alibaba Druid數(shù)據(jù)庫連接池的技術(shù)指南
Druid是阿里巴巴開源平臺上的一個(gè)項(xiàng)目,整個(gè)項(xiàng)目由數(shù)據(jù)庫連接池、插件框架和SQL解析器組成,它不僅支持高效的連接管理,還集成了 SQL 監(jiān)控、日志輸出和多種擴(kuò)展功能,本文將從 Druid 的基本概念出發(fā),結(jié)合具體樣例,帶你全面掌握 Druid 的配置與使用,需要的朋友可以參考下2025-03-03
spring mvc 組合mybatis框架實(shí)例詳解
本項(xiàng)目采用 maven 結(jié)構(gòu),主要演示了 spring mvc + mybatis,controller 獲取數(shù)據(jù)后以json 格式返回?cái)?shù)據(jù)。對spring mvc 組合mybatis的方法感興趣的朋友可以參考下本文2018-01-01
Java實(shí)現(xiàn)在Word文檔中添加批注的示例代碼
在現(xiàn)代辦公環(huán)境中,Word文檔已成為信息傳遞和協(xié)作的重要載體,本教程將深入探討如何利用Java實(shí)現(xiàn)Word文檔批注的自動化添加,感興趣的小伙伴可以了解下2025-10-10
RabbitMQ中的Connection和Channel信道詳解
這篇文章主要介紹了RabbitMQ中的Connection和Channel信道詳解,信道是建立在 Connection 之上的虛擬連接,RabbitMQ 處理的每條 AMQP 指令都是通過信道完成的,需要的朋友可以參考下2023-08-08

