欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學(xué)習(xí)Java之IO流的基礎(chǔ)概念詳解

 更新時(shí)間:2023年09月05日 08:28:05   作者:一一哥Sun  
這篇文章主要給大家介紹了Java中的IO流,我們首先要搞清楚一件事,就是為什么需要IO流這個(gè)東西,但在正式學(xué)習(xí)IO流的使用之前,小編有必要帶大家先了解一下IO流的基本概念,需要的朋友可以參考下

一. IO流概念

首先給大家來(lái)解釋一下 “IO流” 這個(gè)概念,如果我們連 IO流 是個(gè)啥都不知道,也就沒(méi)必要繼續(xù)往下看了。在這里會(huì)從兩部分展開(kāi)介紹IO流,即 “IO” 與 “流” 。

1. IO

IO其實(shí)代表的是兩個(gè)內(nèi)容,即 “I” 與 “O”,它們分別是 “In” 與 “Out” 的縮寫(xiě)。

In:輸入, 代表著能夠接收數(shù)據(jù)的數(shù)據(jù)源對(duì)象,從外部設(shè)備把數(shù)據(jù)輸入到內(nèi)存;

Out:輸出, 代表著能夠產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源對(duì)象,從內(nèi)存中輸出數(shù)據(jù)到外部設(shè)備

對(duì)我們來(lái)說(shuō),大家只需要記住,輸入與輸出都是以內(nèi)存為參照物的即可!

2. 流

接下來(lái)咱們?cè)賮?lái)看看什么是 “流”!請(qǐng)先在腦海里想一下,“流”是一種什么樣的形態(tài)?其實(shí)Java中各個(gè)API的命名都是很形象的,絕對(duì)都做到了見(jiàn)名知意,這里的“流”就是一個(gè)很形象的概念!可以說(shuō),流是一組有序的數(shù)據(jù)序列,能把數(shù)據(jù)從一個(gè)地方帶到另一個(gè)地方。根據(jù)數(shù)據(jù)流向的不同,可以分為輸入(Input)流和輸出(Output)流兩種。

  • 輸入流:當(dāng)我們的代碼程序需要 讀入數(shù)據(jù) 的時(shí)候,可以開(kāi)啟一個(gè)連通 數(shù)據(jù)源 ****的流(輸入流) ,這個(gè)數(shù)據(jù)源可以是文件、內(nèi)存、數(shù)據(jù)庫(kù),或是網(wǎng)絡(luò)連接。
  • 輸出流:同樣的,當(dāng)我們的代碼程序需要 輸出數(shù)據(jù) 的時(shí)候,也可以開(kāi)啟一個(gè)連通 目的地 ****的流(輸出流), 這個(gè)目的地一般是指我們的代碼程序。

你可以想象一下,我們的數(shù)據(jù)好像就是在數(shù)據(jù)源與目的地之間 “流動(dòng)” 了起來(lái)。其實(shí) 流(stream)這個(gè)概念,一開(kāi)始源于UNIX中的管道(pipe)概念 。 在UNIX中,管道是一條不間斷的字節(jié)流,用來(lái)實(shí)現(xiàn)程序或進(jìn)程間的通信,或讀寫(xiě)外圍設(shè)備、外部文件等。最后再給各位提取一下流的概念:

流是一組有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偡Q或抽象。數(shù)據(jù)在兩設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸?shù)奶匦钥梢詫⒘鞒橄鬄楦鞣N類(lèi),方便更直觀的進(jìn)行數(shù)據(jù)操作。

3. IO流

最后,我們?cè)侔袸O流的概念梳理一下。

程序中的數(shù)據(jù)需要移動(dòng)傳輸,比如硬盤(pán)上的數(shù)據(jù)需要出現(xiàn)在顯示器上,從鍵盤(pán)輸入的內(nèi)容需要存儲(chǔ)在硬盤(pán)上,所有的這些操作都要進(jìn)行數(shù)據(jù)傳輸,而在Java中負(fù)責(zé)進(jìn)行數(shù)據(jù)傳輸?shù)募夹g(shù)就是“IO流”。這是一種按順序讀寫(xiě)數(shù)據(jù)的模式,它的特點(diǎn)是單向流動(dòng),數(shù)據(jù)會(huì)像自來(lái)水一樣在水管中流動(dòng),所以我們把它稱為IO流。

外部的數(shù)據(jù)輸入到計(jì)算機(jī),計(jì)算機(jī)內(nèi)部的數(shù)據(jù)輸出到外部,這個(gè)實(shí)現(xiàn)的過(guò)程就是由IO流來(lái)完成的,且輸入和輸出都是以內(nèi)存為中心的。

  • Input輸入:是把數(shù)據(jù)從各種外部的輸入設(shè)備(鍵盤(pán)、麥克風(fēng)等)中讀入到內(nèi)存,例如,把文件從硬盤(pán)讀取到內(nèi)存,從網(wǎng)絡(luò)讀取數(shù)據(jù)到內(nèi)存等;
  • Output輸出:指把數(shù)據(jù)從內(nèi)存輸出到各種外部設(shè)備(如顯示器、磁盤(pán)等),例如,把數(shù)據(jù)從內(nèi)存寫(xiě)入到文件,把數(shù)據(jù)從內(nèi)存輸出到網(wǎng)絡(luò)等。

我們之所以要以內(nèi)存為中心,是因?yàn)榇a要運(yùn)行在內(nèi)存中,這就需要各種數(shù)據(jù)都必須進(jìn)入到內(nèi)存中進(jìn)行處理。大家要注意,IO流對(duì)數(shù)據(jù)的處理,只能按照數(shù)據(jù)序列的順序來(lái)進(jìn)行,即前一個(gè)數(shù)據(jù)處理完之后才能處理后一個(gè)數(shù)據(jù),否則會(huì)產(chǎn)生異常。

二. 作用

那么根據(jù)上面對(duì)IO流的描述,我們就可以搞清楚出IO流的核心作用,如下:

IO流可以在數(shù)據(jù)源和目的地之間搭建一個(gè)傳輸通道,用于處理設(shè)備與代碼程序之間的數(shù)據(jù)傳輸,設(shè)備是指硬盤(pán)、內(nèi)存、數(shù)據(jù)庫(kù)、鍵盤(pán)錄入、網(wǎng)絡(luò)等。

一言以蔽之,IO流屏蔽了實(shí)際的設(shè)備處理數(shù)據(jù)細(xì)節(jié),我們不必關(guān)心其內(nèi)部具體的流動(dòng)過(guò)程,只需知道IO流是用來(lái)處理設(shè)備之間數(shù)據(jù)傳輸?shù)募纯伞?/p>

三. 分類(lèi)

如果你只看上面IO流的概念,感覺(jué)也沒(méi)有什么難度,但是關(guān)于IO流的學(xué)習(xí),最難的是分類(lèi)太多。IO流有著不同的劃分維度,如果我們根據(jù)這些不同的標(biāo)準(zhǔn)來(lái)分類(lèi)的話,可以分類(lèi)如下:

  • 按IO流的流動(dòng)方向分為: 輸入流和輸出流;
  • 按IO流的數(shù)據(jù)單位分為: 字節(jié)流和字符流;
  • 按IO流的不同功能分為: 節(jié)點(diǎn)流和處理流。

接下來(lái)會(huì)分別解釋一下這幾種類(lèi)型。

1. 輸入流與輸出流

從IO流的流動(dòng)方向上,我們知道IO流可以分為輸入流與輸出流,但不少初學(xué)者總是分不清輸入流與輸出流,甚至?xí)褍烧吒惴?。所以接下?lái)就再明確一下輸入流與輸出流的區(qū)別,我們來(lái)看下圖:

在上圖中,我們以家中自來(lái)水的進(jìn)水與出水來(lái)形象的比喻輸入流與輸出流。

  • 自來(lái)水公司相當(dāng)于是數(shù)據(jù)源,我們家中的房子就相當(dāng)于是目的地;
  • 自來(lái)水公司的水進(jìn)入到我們家里,這就是自來(lái)水的輸入;
  • 我們家中產(chǎn)生的污水,要排到污水處理廠,這就是自來(lái)水的輸出。

在這個(gè)供水、排水的過(guò)程中,我們可以想一下,輸入、輸出是不是一個(gè)相對(duì)的概念呢?那么相對(duì)于哪個(gè)角色呢?沒(méi)錯(cuò)!輸入、輸出都是相對(duì)于我們的房子來(lái)說(shuō)的,進(jìn)入到房子叫做輸入,從房子流出就叫做輸出。所以房子就是輸入和輸出的參照物,這就和內(nèi)存是IO流的輸入、輸出參照物一樣!

最后,再把上圖中的各角色明確一下:

  • 數(shù)據(jù)源: 上圖中自來(lái)水公司的水池,用于提供自來(lái)水(數(shù)據(jù));
  • 輸入流: 從自來(lái)水公司進(jìn)到房子里的管道,攜帶著具體的數(shù)據(jù)家里來(lái);
  • 目的地: 上圖中的房子,這代表著我們項(xiàng)目的代碼程序,或者說(shuō)是內(nèi)存;
  • 輸出流: 從家中流出到污水廠的管道流,攜帶著具體的數(shù)據(jù)到污水廠;
  • 數(shù)據(jù)目標(biāo): 最后的污水廠,這是用于持久化存儲(chǔ)污水(數(shù)據(jù))的地方,其實(shí)也是一種數(shù)據(jù)源。

所以,IO流中的輸入流與輸出流,入與出都是相對(duì)于內(nèi)存而言的。從某個(gè)數(shù)據(jù)源讀取數(shù)據(jù)到內(nèi)存中,被稱為輸入流;從內(nèi)存中把數(shù)據(jù)持久化保存到其他設(shè)備上,則被稱為輸出流。簡(jiǎn)單一句話,流向內(nèi)存是輸入流,流出內(nèi)存的輸出流。 我們?cè)賮?lái)看下圖:

另外要注意,我們可以從輸入流中讀取信息,但不能對(duì)它寫(xiě);可以對(duì)輸出流進(jìn)行寫(xiě)操作,但不能對(duì)其讀。所以輸入也叫做讀取數(shù)據(jù),輸出也叫做作寫(xiě)出數(shù)據(jù)

2. 字節(jié)流與字符流

上面說(shuō)了,按照數(shù)據(jù)流的數(shù)據(jù)單位不同,可以把IO流分為字節(jié)流與字符流,兩者的區(qū)別如下:

  • 字節(jié)流: 字節(jié)流是以字節(jié)(8bit)為單位進(jìn)行數(shù)據(jù)的按序傳輸,一次讀取或?qū)懭胍粋€(gè)字節(jié)(8位)的二進(jìn)制數(shù)據(jù), 字節(jié)流能處理所有類(lèi)型的數(shù)據(jù)(如圖片、音頻、視頻等) ;
  • 字符流: 字符流以字符為單位進(jìn)行數(shù)據(jù)的按序傳輸,根據(jù)碼表映射字符,一次讀取或?qū)懭胍粋€(gè)字符(可能是多個(gè)字節(jié)),一次讀入或?qū)懗?6位二進(jìn)制數(shù)據(jù), 字符流只能處理文本文件中的字符類(lèi)型數(shù)據(jù)

字節(jié)流和字符流的這些區(qū)別,主要是因?yàn)镴ava一個(gè)字節(jié)的空間是1個(gè)Byte,即8位;而一個(gè)字符的空間是2個(gè)Byte,即16位。另外Java的字節(jié)是有符號(hào)類(lèi)型,字符是無(wú)符號(hào)類(lèi)型!

另外我們還知道,計(jì)算機(jī)中的一切文件數(shù)據(jù)(文本、圖片、視頻等)在存儲(chǔ)時(shí),都是以二進(jìn)制的形式保存的,即都是一個(gè)一個(gè)的字節(jié),在傳輸時(shí)也同樣如此。所以,字節(jié)流可以傳輸任意類(lèi)型的文件數(shù)據(jù)。在操作流的時(shí)候,我們要時(shí)刻明確,無(wú)論使用什么樣的流,底層傳輸?shù)氖冀K為二進(jìn)制數(shù)據(jù)。

但如果我們需要讀寫(xiě)的內(nèi)容是字符,并且字符不全是單字節(jié)表示的ASCII字符。有很多的字符是用Unicode編碼表示的,采用的是雙字節(jié),而InputerStream是用來(lái)處理單字節(jié)的,在處理字符文本時(shí)不是很方便,所以就需要有一種可以高效處理字符的流。字符流的本質(zhì)其實(shí)也是基于字節(jié)流的,所以字節(jié)流和字符流的原理其實(shí)也是相同的,只不過(guò)處理的數(shù)據(jù)單位大小不同而已。一般情況下,Java所有關(guān)于IO流的API,后綴是Stream的是字節(jié)流,后綴是Reader和Writer的是字符流。但你可能會(huì)問(wèn),我們?cè)陂_(kāi)發(fā)時(shí),到底是要選擇字節(jié)流還是字符流呢?

答案就是,對(duì)于字節(jié)流和字符流,如果我們只是想處理純文本數(shù)據(jù),可以優(yōu)先考慮字符流,除此之外盡量使用字節(jié)流。

3. 節(jié)點(diǎn)流與處理流

另外如果從IO流的功能角度來(lái)看,IO流可以分為節(jié)點(diǎn)流和處理流,兩者有以下區(qū)別。

節(jié)點(diǎn)流,可以直接與數(shù)據(jù)源相連,進(jìn)行讀入或?qū)懗觥?/strong>

但如果我們直接使用節(jié)點(diǎn)流進(jìn)行操作,讀寫(xiě)并不方便,所以為了更快的讀寫(xiě)文件,就有了處理流。

處理流,一般會(huì)與節(jié)點(diǎn)流一起使用,在節(jié)點(diǎn)流的基礎(chǔ)上,再套接一層,套接在節(jié)點(diǎn)流上的就是處理流。

四. 使用場(chǎng)景

總之,Java中有種類(lèi)豐富且功能強(qiáng)大的IO流機(jī)制,包含了多種流類(lèi)型,例如:字節(jié)流、字符流、緩沖流、數(shù)據(jù)流、對(duì)象流等。我們利用這些流,可以進(jìn)行文件讀寫(xiě)、網(wǎng)絡(luò)傳輸、圖片處理、音頻視頻處理等場(chǎng)景。

五. 結(jié)語(yǔ)

至此,就在今天的這篇文章中給大家科普了IO流的基本概念,今天的重點(diǎn)如下:

  • IO流是一種流式的數(shù)據(jù)輸入/輸出模型,負(fù)責(zé)在數(shù)據(jù)源和目的地之間搭建一個(gè)傳輸通道,用于處理設(shè)備與代碼程序之間的數(shù)據(jù)傳輸;
  • 輸入與輸出都是針對(duì)內(nèi)存而言的;
  • 字節(jié)流是以字節(jié)(8bit)為單位進(jìn)行數(shù)據(jù)的按序傳輸,一次讀取或?qū)懭胍粋€(gè)字節(jié)(8位)的二進(jìn)制數(shù)據(jù);
  • 字符流以字符為單位進(jìn)行數(shù)據(jù)的按序傳輸,根據(jù)碼表映射字符,一次讀取或?qū)懭胍粋€(gè)字符(可能是多個(gè)字節(jié))。

以上就是學(xué)習(xí)Java之IO流的基礎(chǔ)概念詳解的詳細(xì)內(nèi)容,更多關(guān)于Java IO流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java可變參數(shù)當(dāng)做數(shù)組處理的方法示例

    java可變參數(shù)當(dāng)做數(shù)組處理的方法示例

    這篇文章主要介紹了java可變參數(shù)當(dāng)做數(shù)組處理的方法,結(jié)合實(shí)例形式分析了java可變參數(shù)當(dāng)做數(shù)組處理相關(guān)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • Spring攔截器和過(guò)濾器的區(qū)別在哪?

    Spring攔截器和過(guò)濾器的區(qū)別在哪?

    相信很多小伙伴都對(duì)Spring攔截器和過(guò)濾器的區(qū)別有疑惑,今天特地整理了本篇文章,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • 功能強(qiáng)大的TraceId?搭配?ELK使用詳解

    功能強(qiáng)大的TraceId?搭配?ELK使用詳解

    這篇文章主要為大家介紹了功能強(qiáng)大的TraceId?搭配?ELK使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java排序?qū)崿F(xiàn)的心得分享

    Java排序?qū)崿F(xiàn)的心得分享

    這篇文章主要介紹了Java排序?qū)崿F(xiàn)的心得,有需要的朋友可以參考一下
    2014-01-01
  • 基于Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總

    基于Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總

    我們?cè)谧龇?wù)器系統(tǒng)開(kāi)發(fā)的時(shí)候,為了適應(yīng)數(shù)據(jù)大并發(fā)的請(qǐng)求,需要插入數(shù)據(jù)庫(kù)之前生成一個(gè)全局的唯一id,糾結(jié)全局唯一id怎么生成呢?下面小編給大家分享Java代碼實(shí)現(xiàn)游戲服務(wù)器生成全局唯一ID的方法匯總,涉及到優(yōu)劣勢(shì)方面的知識(shí)點(diǎn),對(duì)此感興趣的朋友一起看看吧
    2016-10-10
  • java并發(fā)包JUC誕生及詳細(xì)內(nèi)容

    java并發(fā)包JUC誕生及詳細(xì)內(nèi)容

    這篇文章主要為大家介紹了java并發(fā)包JUC的誕生及JUC增加的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 解決報(bào)java.lang.AssertionError錯(cuò)誤的問(wèn)題

    解決報(bào)java.lang.AssertionError錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了解決報(bào)java.lang.AssertionError錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    本文詳細(xì)介紹了如何利用SpringSecurity來(lái)實(shí)現(xiàn)手機(jī)驗(yàn)證碼的注冊(cè)和登錄功能,在登錄過(guò)程中,同樣需通過(guò)驗(yàn)證碼進(jìn)行驗(yàn)證,文章還提供了相關(guān)的代碼實(shí)現(xiàn)
    2024-10-10
  • SpringMVC數(shù)據(jù)響應(yīng)詳細(xì)介紹

    SpringMVC數(shù)據(jù)響應(yīng)詳細(xì)介紹

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),本章來(lái)講解SpringMVC數(shù)據(jù)響應(yīng)
    2023-02-02
  • java基于正則表達(dá)式實(shí)現(xiàn)時(shí)間日期的常用判斷操作實(shí)例

    java基于正則表達(dá)式實(shí)現(xiàn)時(shí)間日期的常用判斷操作實(shí)例

    這篇文章主要介紹了java基于正則表達(dá)式實(shí)現(xiàn)時(shí)間日期的常用判斷操作,簡(jiǎn)單說(shuō)明了正則表達(dá)式常用元字符含義并結(jié)合實(shí)例形式分析了java基于正則表達(dá)式針對(duì)常用日期時(shí)間格式的判斷操作技巧,需要的朋友可以參考下
    2017-10-10

最新評(píng)論