IO流 詳細介紹

一、IO流概述

1.IO:輸入(Input讀取數據)/輸出(Output寫數據)

2.流:是一種抽象概念,是對數據傳輸的總稱,也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的。

3.常見的應用:文件上傳、下載、復制等。

文件通常是由一連串的字節或字符構成,組成文件的字節序列稱為字節流,組成文件的字符序列稱為字符流。Java中根據流的方向可以分為輸入流和輸出流。輸入流是將文件或其它輸入設備的數據加載到內存的過程;輸出流恰恰相反,是將內存中的數據保存到文件或其他輸出設備,詳見下圖:

1648290969(1).png

?二、IO流分類

2.1? 根據數據流向分類: ?

輸入流:讀數據 ?將硬盤中的數據讀取到內存中 ?

輸出流:寫數據 ?將程序中的數據寫入到硬盤中

1648291002(1).png

2.2? 按照數據類型來分:

字節流: 字節輸入流/字節輸出流 ?

字符流: 字符輸入流/字符輸出流

2.3? IO流應用場景: ?

純文本文件,優先使用字符流 ?

圖片、視頻、音頻等二進制文件,優先使用字節流 ?

不確定文件類型,優先使用字節流,字節流是萬能的流

2.4??InputStream(字節輸入流)、OutputStream(字節輸出流)、Reader(字符輸入流)、Writer(字符輸出流)

2.4.1??InputStream(字節輸入流)

InputStream是字節輸入流,InputStream是一個抽象類,所有繼承了InputStream的類都是字節輸入流,主要了解以下子類即可:

1648291105(1).png

主要方法介紹:?

void

close()
關閉此輸入流并釋放與該流關聯的所有系統資源。

abstract int

read()
從輸入流讀取下一個數據字節。(多次調用會按順序依次讀取)返回-1表示讀取完畢

int

read(byte[] b)
從輸入流中讀取一定數量的字節并將其存儲在緩沖區數組 b 中。

int

read(byte[] b, int off, int len)
將輸入流中最多 len 個數據字節讀入字節數組。

2.4.2??OutputStream(字節輸出流)

1648291222(1).png

主要方法介紹:?

void

close()
關閉此輸出流并釋放與此流有關的所有系統資源。

void

flush()
刷新此輸出流并強制寫出所有緩沖的輸出字節。

void

write(byte[] b)
將 b.length 個字節從指定的字節數組寫入此輸出流。

void

write(byte[] b, int off, int len)
將指定字節數組中從偏移量 off 開始的 len 個字節寫入此輸出流。

abstract void

write(int b)
將指定的字節寫入此輸出流。

2.4.3??Reader(字符輸入流)

所有繼承了Reader都是字符輸如流

1648291279(1).png

主要方法介紹:

abstract void

close()
關閉該流。

int

read()
讀取單個字符。(多次調用會按順序依次讀取)返回-1表示讀取完畢

int

read(char[] cbuf)
將字符讀入數組。

abstract int

read(char[] cbuf, int off, int len)
將字符讀入數組的某一部分。

?2.4.4??Writer(字符輸出流)

所有繼承了Writer都是字符輸出流

1648291330(1).png

主要方法介紹:

Writer

append(char c)
將指定字符追加到此 writer。

abstract void

close()
關閉此流,但要先刷新它。

abstract void

flush()
刷新此流。

void

write(char[] cbuf)
寫入字符數組。

abstract void

write(char[] cbuf, int off, int len)
寫入字符數組的某一部分。

void

write(int c)
寫入單個字符。

void

write(String str)
寫入字符串。

void

write(String str, int off, int len)
寫入字符串的某一部分。

?三、文件流

3.1??FileInputStream(文件字節輸入流)

FileInputStream:從文件系統中的文件獲取輸入字節;

FileInputStream(String name):通過打開與實際文件的連接來創建一個FileInputStream,該文件有文件系統中的路徑名name命名;

步驟:

1.創建字節輸入流對象

2.調用字節輸入流對象的讀數據方法

3.釋放資源

字節流讀取數據:

方法名稱

說明

int?read()

從該輸入流讀取一個字節數據,返回值為-1時說明文件讀取完畢(多次調用會按順序依次讀取)

InputStream in = new FileInputStream("d:/a.txt");int c = 0;
while((c = in.read()) != -1){System.out.println(c);
}in.close();

上述代碼在執行時:如果在執行in.read()時沒有讀取到末尾,即文件還有可讀取的數據,in.read()方法會返回下一個可用字節的整數值(0-255之間)。如果已經讀取到了文件末尾,in.read()方法會返回-1。

3.2??FileOutputStream(文件字節輸出流)

字節流寫入數據常用的三種方式:?

方法名稱

說明

void?write(int?b)

將指定的字節寫入此文件輸出流?一次寫一個字節數據

void?write(byte[]?b)

將?b.length字節從指定的字節數組寫入此文件輸出流?一次寫一個字節數組數據

void?write(byte[]?b,?int?off,?int?len)

將?len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流?一次寫一個字節數組的部分數據

void write(byte[] b, int off, int len)是Java中OutputStream類的一個方法,用于將指定字節數組中的一部分數據寫入輸出流。

參數解釋:

  • b:要寫入的字節數組。
  • off:寫入的起始偏移量,即從數組的第off個位置開始寫入數據。
  • len:要寫入的字節數,即寫入b數組中從off位置開始的連續len個字節。

如何追加寫入數據:

字節流寫入數據通過 new FileOutputStream(new File("mayikt.txt"), true); 表示追加寫入數據。 如果第二個參數為true,則字節流寫入文件的末尾。此方法通過在構造FileOutputStream對象時將第二個參數設置為true來實現追加寫入。

InputStream in = new FileInputStream("d:/a.txt");
OutputStream out = new FileOutputStream("d:/aa.txt");int c = 0;
while((c = in.read()) != -1){out.write(c);
}in.close();
out.close();

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

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

相關文章

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據) 1.模型原理1.1 模型原理1.2 數學模型2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 隨機森林(Random Forest)是一種集成學習方法,通過組合多個決策樹來構建強大的分類或回歸…

JVM - 垃圾回收機制

JVM的垃圾回收機制(簡稱GC) JVM的垃圾回收機制非常強大,是JVM的一個很重要的功能,而且這也是跟對象實例息息相關的,如果對象實例不用了要怎么清除呢? 如何判斷對象已經沒用了 當JVM認為一個對像已經沒用了,就會把這個…

初識Sentinel

目錄 1.解決雪崩的方式有4種: 1.1.2超時處理: 1.1.3倉壁模式 1.1.4.斷路器 1.1.5.限流 1.1.6.總結 1.2.服務保護技術對比 1.3.Sentinel介紹和安裝 1.3.1.初識Sentinel 1.3.2.安裝Sentinel 1.4.微服務整合Sentinel 2.流量控制 2.1.簇點鏈路 …

Ubuntu中怎么清空mysql數據

要清空 MySQL 數據,可以使用以下步驟來執行。請注意,這將會永久刪除數據庫中的所有數據,請謹慎操作,并在操作前備份重要數據。 登錄 MySQL: 打開終端,使用以下命令登錄到 MySQL 數據庫。根據情況&#xf…

黑馬項目一階段面試58題 Web14題(一)

一、什么是AJAX 異步的JavaScript和XML。用來做前端和后端的異步請求的技術。 異步請求:只更新部分前端界面的請求,做到局部更新。 比如注冊,提示用戶名已存在而整個頁面沒有動 比如百度圖片搜索美女,進度條越變越短&#xff…

== 和 equals 的對比 [面試題]

和 equals 的對比[面試題] 文章目錄 和 equals 的對比[面試題]1. 和 equals 簡介2. Object 類中 equals() 源碼3. String 類中 equals() 源碼4. Integer 類中 equals() 源碼5. 如何重寫 equals 方法 1. 和 equals 簡介 是一個比較運算符 :既可以判斷基本數據類型…

【數據結構OJ題】鏈表的回文結構

原題鏈接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 在做這道…

re中的match和search有什么區別?

問題:請說明以下re模塊中的match和search有什么區別? re.match()與re.search()的區別 re.match()只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,結果返回None,而re.search()匹配整個字符串,直到找到一個匹配 re.search() re.search()掃描整個字符串并…

老師如何制作二維碼分班查詢系統?技術老師分享的創建框架值得借鑒

作為一名班主任,開學前需要搞定分班問題,可以通過制作一個分班二維碼查詢系統,讓學生和家長可以通過掃描二維碼快速查到自己的分班信息,分享一下我制作的過程,希望對老師們有幫助(結尾有驚喜)&a…

內網穿透——使用Windows自帶的網站程序建立網站

文章目錄 1.前言2.Windows網頁設置2.1 Windows IIS功能設置2.2 IIS網頁訪問測試 3. Cpolar內網穿透3.1 下載安裝Cpolar3.2 Cpolar云端設置3.3 Cpolar本地設置 4.公網訪問測試5.結語 1.前言 在網上各種教程和介紹中,搭建網頁都會借助各種軟件的幫助,比如…

RP2040開發板自制樹莓派邏輯分析儀

目錄 前言 1 準備工作和前提條件 1.1 Raspberry Pi Pico RP2040板子一個 1.2 Firmware-LogicAnalyzer-5.0.0.0-PICO.uf2固件 1.3 LogicAnalyzer-5.0.0.0-win-x64軟件 2 操作指南 2.1 按住Raspberry Pi Pico開發板的BOOTSEL按鍵,再接上USB接口到電腦 2.2 刷入…

End-to-End Object Detection with Transformers

DERT 目標檢測 基于卷積神經網絡的目標檢測回顧DETR對比Swin Transformer摘要檢測網絡流程DERT網絡架構編碼器概述解碼器概述整體結構object queries的初始化Decoder中的Muiti-Head Self-AttentionDecoder中的Muiti-Head Attention 損失函數解決的問題 基于卷積神經網絡的目標檢…

內網穿透實戰應用——【通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁】

通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁 文章目錄 通過cpolar分享本地電腦上有趣的照片:發布piwigo網頁前言1. 設定一條內網穿透數據隧道2. 與piwigo網站綁定3. 在創建隧道界面填寫關鍵信息4. 隧道創建完成 總結 前言 首先在本地電腦上部署…

Unity - 從PackageManager中安裝內置工具

1.MemoryProfiler 內存分析工具 add from git url :com.unity.memoryprofiler 使用地址記錄:unity3d內存分析工具memory profiler_unity3d memory profile_Marco&GalaxyDragon的博客-CSDN博客 理解Unity Memory Profiler - 知乎

Gradle和Maven的詳細講解和兩者之間的區別

Gradle 詳細介紹 Gradle 是一種基于 Groovy 語言的構建自動化工具,用于構建、測試和部署項目。它使用聲明式的腳本來定義構建過程,允許開發者靈活地配置項目構建。Gradle 使用一種被稱為 Groovy DSL(領域特定語言)的語法&#xf…

mysql知識點+面試總結

目錄 1 mysql介紹 2 數據庫常見語法 3 數據庫表的常見語法 4 其他常見語法(日期,查詢表字段) 5 JDBC開發步驟 6 索引 6.1 索引常見語法 7 常見面試總結 8 java代碼搭建監控頁面 1 mysql介紹 數據庫:存儲在硬盤上的文件系統…

VR虛擬展廳如何將客戶引流到線下?

VR虛擬展廳是一項很不錯的創新技術,將傳統的展覽內容以數字化形式呈現,為參觀者帶來全新的展示體驗,也為企業帶來了全新的宣傳機遇。 線上虛擬展廳目前有著兩種形式,一種是通過三維建模技術、虛擬現實技術等搭建的虛擬展廳&#x…

leetcode 474. 一和零

2023.8.15 class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m1, vector<int>(n1,0));//遍歷物品for(string str : strs){int num_0 0;int num_1 0;for(char c : str){if(c 0) num_0;el…

Docker 容器內無法使用vim命令 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 進入Docker容器后 無法使用vim編輯器,出現如下問題:bash: vim: command not found 如圖所示: 想著通過apt-get 安裝vim,出現如下問題: root@b9f0fd330d5b:/# apt-get install vim Reading package lists... Done B…

ZooKeeper介紹

ZooKeeper是一個開放源代碼的分布式協調服務。ZooKeeper的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來&#xff0c;構成一個高效可靠的原語集&#xff0c;并以一系列簡單易用的接口提供給用戶使用。 ZooKeeper是一個典型的分布式數據一致性的解決方案&#xff0…