網站首頁 編程語言 正文
Java標準庫的java.io.InputStream定義了所有輸入流的超類:
FileInputStream實現了文件流輸入;
BufferedInputStream使用緩沖區提高文件的讀取效率;
ByteArrayInputStream在內存中模擬一個字節流輸入;
一. FileInputStream(文件輸入流)
FileInputStream是InputStream的子類,是從文件流中讀取數據,每次讀取都是從硬盤中讀取,讀取速度較慢;
InputStream中通過 read()方法讀取輸入流的下一字節,并返回字節表示的 int 值(0 ~ 255),如果讀到-1就不能繼續讀取;
InputStream緩沖讀?。合榷x一個byte[]數組作為緩沖區,read()方法會盡可能多的讀取字節到緩沖區,但不會超過緩沖區的大小。
利用緩沖區一次讀取InputStream的所有字節(兩種方法):
(1)? 逐個字節讀取;(2)批量讀取。
代碼實現如下:
try (InputStream in = new FileInputStream("D:\\countNumber.text")) {
// 方式1:逐個字節讀取
// int data = -1;
// while((data = in.read()) != -1) {
// System.out.println((char)data);
// }
// 方式2:批量讀取
byte[] buff = new byte[1000]; // 定義1000個字節大小的緩沖區
int size = -1;
while((size = in.read(buff)) != -1) {
System.out.println();
}
} catch (IOException e1) {
e1.printStackTrace();
}
二 . BufferedInputStream(緩沖輸入流)
BufferedInputStream是緩沖輸入流(帶有緩沖區的字節輸入流),繼承于FilterInputStream(是InputStream的子類),作用是為另一個輸入流添加一些功能:提供緩沖功能以及支持“mark() 標記”,“reset()重置方法";
BufferedInputStream本質是通過一個內部緩沖區數組實現的,它有一個默認大小為8192的緩沖區(讀取速度較快)。例如,在新建某輸入流對應的BufferedInputStream后,當我們通過read()讀取輸入流的數據時,BufferedInputStream會將該輸入流的數據分批的填充到緩沖區中。每當緩沖區的數據被讀完之后,輸入流會再次填充數據緩沖區;如此反復,直到我們讀完輸入流數據位置。
public class BufferedInputStream extends FilterInputStream {
private static int DEFAULT_BUFFER_SIZE = 8192;
...}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\countNumber.text"))) {
// 方式1:逐個字節讀取
// int data = -1;
//while((data = bis.read()) != -1) {
// System.out.println(data);
// }
// 方式2:批量讀取
byte[] buffData = new byte[128]; // 用來存儲每次讀取到的字節數組
int len = -1; // 每次讀取到的字節數組的長度
while((len = bis.read(buffData)) != -1) {
System.out.println(Arrays.toString(buffData));
}
} catch (IOException e) {
e.printStackTrace();
}
?注:如果打開了一個文件進行讀寫,完成后要及時關閉,以便讓os釋放資源 (try語句:快捷鍵:shift+alt+z,編譯器會自動寫入finally并調用close()),實際上,編譯器并不會特別的為InputStream加上自動關閉,而是因為其實現了AutoCloseable接口,由于實現了此接口,才會自動寫入finally并調用close();
原文鏈接:https://blog.csdn.net/weixin_45939128/article/details/124851050
相關推薦
- 2022-03-14 Linux磁盤格式化和掛載(linux服務器硬盤掛載步驟)
- 2022-09-22 使用einops簡化數據維度操作
- 2022-09-04 ffmpeg網頁視頻流m3u8?ts實現視頻下載_相關技巧
- 2022-01-20 簡易登錄表單的制作,包括用戶名、密碼、隨機驗證碼(代碼完整,復制即用)
- 2022-08-27 C++中Boost的智能指針weak_ptr_C 語言
- 2022-08-16 Go單元測試工具gomonkey的使用_Golang
- 2022-02-04 Linux中查看進程命令ps aux,ps -ef,ps -A,ps -a
- 2022-10-21 C++?smart?pointer全面深入講解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支