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

一.流的概念:
流是一組有順序的,有起點(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)始支持。