java I/O的一些簡(jiǎn)單總結(jié)

java流類(lèi)結(jié)構(gòu)圖


image.png

一.流的概念:

流是一組有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偡Q(chēng)或抽象。它的特性是進(jìn)行數(shù)據(jù)傳輸;

例如從水源地長(zhǎng)江把水導(dǎo)入自來(lái)水廠,然后又從自來(lái)水廠把水送到各家各戶。從長(zhǎng)江到自來(lái)水廠之間的管道我們可以稱(chēng)之為輸入流,從自來(lái)水廠把水送到各家各戶的管道我們稱(chēng)之為輸出流,我們大概可以這么理解。

二.流的繼承體系

在java中,為了對(duì)不同來(lái)源和性質(zhì)的流對(duì)象調(diào)用統(tǒng)一的方法,java中的流首先定義了頂層輸入/輸出流的接口或抽象類(lèi),這樣不同性質(zhì)具體的流對(duì)象就會(huì)有統(tǒng)一的調(diào)用方法以便使用,在使用流對(duì)象時(shí),盡量的按照在具體流所實(shí)現(xiàn)的接口(抽象類(lèi))中定義的方法使用。

三.流的分類(lèi)

流按照流向數(shù)據(jù)流向可以分為輸入流和輸出流。

流按照處理數(shù)據(jù)類(lèi)型的單位不同可以分為字節(jié)流和字符流。

四.字節(jié)流和字符流

字節(jié)流:InputStream和OutputStream是java中可以按照最小字節(jié)單位讀取的流,即每次讀寫(xiě)一個(gè)字節(jié),字節(jié)流是直接連接到輸入源的流。

字符流:是以字符為單位進(jìn)行數(shù)據(jù)處理的IO流。本質(zhì)其實(shí)就是基于字節(jié)流讀取時(shí),去查找指定的碼表。

字節(jié)流與字符流之間的區(qū)別:

1.讀寫(xiě)單位不同:字節(jié)流式以字節(jié)(8位2進(jìn)制)為單位,字符流是以字符為單位,根據(jù)碼表映射字符,一次可能讀多個(gè)字節(jié)。

2.處理對(duì)象不同:字節(jié)流能處理所有類(lèi)型的數(shù)據(jù)(如圖片、avi等),而字符流只能處理字符類(lèi)型的數(shù)據(jù)。

3.一次讀入或讀出是8位二進(jìn)制。

4.字符流:一次讀入或讀出是16位二進(jìn)制。

結(jié)論:只要是純文本數(shù)據(jù)優(yōu)先使用字符流,除此之外都使用字節(jié)流。

五.輸入流和輸出流的用途

輸入流是指程序從數(shù)據(jù)源中讀取數(shù)據(jù)。只進(jìn)行讀操作;

輸出流是指將數(shù)據(jù)從程序中寫(xiě)到指定的文件中;

六.輸入流字節(jié)流InputStream與輸出字節(jié)流InputStream

InputStream是一個(gè)抽象類(lèi),是所有輸入字節(jié)流的父類(lèi)。

2.ByteArrayInputStream、StringBufferInputStream、FileInputStream是三中基本的戒指了,他們分別從數(shù)組、StringBuffer、和本地文件中讀取數(shù)據(jù)。

3.PipedInputStream是從與其它線程共用的管道中讀取數(shù)據(jù),與Piped 相關(guān)的知識(shí)后續(xù)單獨(dú)介紹。

4.ObjectInputStream 和所有FilterInputStream 的子類(lèi)都是裝飾流(裝飾器模式的主角)。

OutputStream 是所有的輸出字節(jié)流的父類(lèi),它是一個(gè)抽象類(lèi)。

1.ByteArrayOutputStream、FileOutputStream 是兩種基本的介質(zhì)流,它們分別向Byte 數(shù)組、和本地文件中寫(xiě)入數(shù)據(jù)。

2.PipedOutputStream 是向與其它線程共用的管道中寫(xiě)入數(shù)據(jù)。

3.ObjectOutputStream 和所有FilterOutputStream 的子類(lèi)都是裝飾流。

七.節(jié)點(diǎn)流和處理流的概念

節(jié)點(diǎn)流:直接與數(shù)據(jù)相連,進(jìn)行數(shù)據(jù)的讀寫(xiě);

處理流:是指在節(jié)點(diǎn)流上套接了一層。

常用的節(jié)點(diǎn)流

1.文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件進(jìn)行處理的節(jié)點(diǎn)流

2.數(shù) 組 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 對(duì)數(shù)組進(jìn)行處理的節(jié)點(diǎn)流(對(duì)應(yīng)的不再是文件,而是內(nèi)存中的一個(gè)數(shù)組)

3.字符串 :StringReader、 StringWriter 對(duì)字符串進(jìn)行處理的節(jié)點(diǎn)流

4.管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 對(duì)管道進(jìn)行處理的節(jié)點(diǎn)流

常用的處理流

1.緩沖流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加緩沖功能,避免頻繁讀寫(xiě)硬盤(pán)。

2.轉(zhuǎn)換流:InputStreamReader 、OutputStreamReader實(shí)現(xiàn)字節(jié)流和字符流之間的轉(zhuǎn)換。

3.數(shù)據(jù)流: DataInputStream 、DataOutputStream 等-提供將基礎(chǔ)數(shù)據(jù)類(lèi)型寫(xiě)入到文件中,或者讀取出來(lái)。

八.轉(zhuǎn)換流

InputStreamReader 、OutputStreamWriter 要InputStream或OutputStream作為參數(shù),實(shí)現(xiàn)從字節(jié)流到字符流的轉(zhuǎn)換。

BIO、NIO 和 AIO 的區(qū)別、三種 IO 的用法與原理

IO
什么是 IO? 它是指計(jì)算機(jī)與外部世界或者一個(gè)程序與計(jì)算機(jī)的其余部分的之間的接
口。它對(duì)于任何計(jì)算機(jī)系統(tǒng)都非常關(guān)鍵,因而所有 I/O 的主體實(shí)際上是內(nèi)置在操作系統(tǒng)中
的。單獨(dú)的程序一般是讓系統(tǒng)為它們完成大部分的工作。
在 Java 編程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被視為單個(gè)的
字節(jié)的移動(dòng),通過(guò)一個(gè)稱(chēng)為 Stream 的對(duì)象一次移動(dòng)一個(gè)字節(jié)。流 I/O 用于與外部世界
接觸。它也在內(nèi)部使用,用于將對(duì)象轉(zhuǎn)換為字節(jié),然后再轉(zhuǎn)換回對(duì)象。
BIO
Java BIO 即 Block I/O ,同步并阻塞的 IO。
BIO 就是傳統(tǒng)的 java.io 包下面的代碼實(shí)現(xiàn)。
NIO
什么是NIO? NIO 與原來(lái)的 I/O 有同樣的作用和目的, 他們之間最重要的區(qū)別是數(shù)據(jù)
打包和傳輸?shù)姆绞?。原?lái)的 I/O 以流的方式處理數(shù)據(jù),而 NIO 以塊的方式處理數(shù)據(jù)。
面向流 的 I/O 系統(tǒng)一次一個(gè)字節(jié)地處理數(shù)據(jù)。一個(gè)輸入流產(chǎn)生一個(gè)字節(jié)的數(shù)據(jù),一個(gè)
輸出流消費(fèi)一個(gè)字節(jié)的數(shù)據(jù)。為流式數(shù)據(jù)創(chuàng)建過(guò)濾器非常容易。鏈接幾個(gè)過(guò)濾器,以便每個(gè)
過(guò)濾器只負(fù)責(zé)單個(gè)復(fù)雜處理機(jī)制的一部分,這樣也是相對(duì)簡(jiǎn)單的。不利的一面是,面向流的
I/O 通常相當(dāng)慢。
一個(gè) 面向塊 的 I/O 系統(tǒng)以塊的形式處理數(shù)據(jù)。每一個(gè)操作都在一步中產(chǎn)生或者消費(fèi)
一個(gè)數(shù)據(jù)塊。按塊處理數(shù)據(jù)比按(流式的)字節(jié)處理數(shù)據(jù)要快得多。但是面向塊的 I/O 缺少一
些面向流的 I/O 所具有的優(yōu)雅性和簡(jiǎn)單性。
AIO
Java AIO 即 Async 非阻塞,是異步非阻塞的 IO。
205 > I/O 流
區(qū)別及聯(lián)系
BIO (Blocking I/O):同步阻塞 I/O 模式,數(shù)據(jù)的讀取寫(xiě)入必須阻塞在一個(gè)線程內(nèi)
等待其完成。這里假設(shè)一個(gè)燒開(kāi)水的場(chǎng)景,有一排水壺在燒開(kāi)水,BIO 的工作模式就是,
叫一個(gè)線程停留在一個(gè)水壺那,直到這個(gè)水壺?zé)_(kāi),才去處理下一個(gè)水壺。但是實(shí)際上線程
在等待水壺?zé)_(kāi)的時(shí)間段什么都沒(méi)有做。
NIO (New I/O):同時(shí)支持阻塞與非阻塞模式,但這里我們以其同步非阻塞 I/O 模
式來(lái)說(shuō)明,那么什么叫做同步非阻塞?如果還拿燒開(kāi)水來(lái)說(shuō),NIO 的做法是叫一個(gè)線程不
斷的輪詢每個(gè)水壺的狀態(tài),看看是否有水壺的狀態(tài)發(fā)生了改變,從而進(jìn)行下一步的操作。
AIO ( Asynchronous I/O):異步非阻塞 I/O 模型。異步非阻塞與同步非阻塞的區(qū)
別在哪里?異步非阻塞無(wú)需一個(gè)線程去輪詢所有 IO 操作的狀態(tài)改變,在相應(yīng)的狀態(tài)改變后,
系統(tǒng)會(huì)通知對(duì)應(yīng)的線程來(lái)處理。對(duì)應(yīng)到燒開(kāi)水中就是,為每個(gè)水壺上面裝了一個(gè)開(kāi)關(guān),水燒
開(kāi)之后,水壺會(huì)自動(dòng)通知我水燒開(kāi)了。 各自適用場(chǎng)景
BIO 方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,
并發(fā)局限于應(yīng)用中,JDK1.4 以前的唯一選擇,但程序直觀簡(jiǎn)單易理解。
NIO 方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)
局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4 開(kāi)始支持。
AIO 方式適用于連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器,充分
調(diào)用 OS 參與并發(fā)操作,編程比較復(fù)雜,JDK7 開(kāi)始支持。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 I/O流的概念,分類(lèi)2 I/O所有類(lèi)的結(jié)構(gòu)圖及詳解3 何為NIO,和傳統(tǒng)I/O有何區(qū)別4 在開(kāi)發(fā)中正確使用I/...
    艾剪疏閱讀 548評(píng)論 0 2
  • 本文對(duì)Java I/O基礎(chǔ)知識(shí)復(fù)習(xí)的一個(gè)總結(jié)。 一、概覽 Java 的 I/O 大概可以分成以下幾類(lèi): 磁盤(pán)操作:...
    stoneyang94閱讀 837評(píng)論 0 0
  • Java 的 I/O 庫(kù)分為以 streams 為核心的 java.io 和以 buffers 和 channel...
    skeeey閱讀 561評(píng)論 0 0
  • 本文介紹操作系統(tǒng)I/O工作原理,Java I/O設(shè)計(jì),基本使用,開(kāi)源項(xiàng)目中實(shí)現(xiàn)高性能I/O常見(jiàn)方法和實(shí)現(xiàn),徹底搞懂...
    caison閱讀 1,908評(píng)論 2 4
  • 導(dǎo)語(yǔ): 記得剛剛學(xué)習(xí)Java I/O的時(shí)候,被輸入輸出流的層次結(jié)構(gòu)嚇得不輕,一整個(gè)流家族里面,包含了各種流類(lèi)型,其...
    wuqke閱讀 871評(píng)論 1 1

友情鏈接更多精彩內(nèi)容