成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

面試官:談?wù)勀銓O流和NIO的理解

一、概念

NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現(xiàn)方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了兩套NIO,一套是針對標準輸入輸出NIO,另一套就是網(wǎng)絡(luò)編程NIO。

創(chuàng)新互聯(lián)建站服務(wù)項目包括平桂網(wǎng)站建設(shè)、平桂網(wǎng)站制作、平桂網(wǎng)頁制作以及平桂網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,平桂網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到平桂省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

二、NIO和IO的主要區(qū)別

下表總結(jié)了Java IO和NIO之間的主要區(qū)別:
面試官:談?wù)勀銓O流和NIO的理解

1、面向流與面向緩沖

Java IO和NIO之間第一個最大的區(qū)別是,IO是面向流的,NIO是面向緩沖區(qū)的。

Java IO面向流意味著每次從流中讀一個或多個字節(jié),直至讀取所有字節(jié),它們沒有被緩存在任何地方。此外,它不能前后移動流中的數(shù)據(jù)。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將它緩存到一個緩沖區(qū)。

Java NIO面向緩沖區(qū)的緩沖導(dǎo)向方法略有不同。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)。而且,需確保當更多的數(shù)據(jù)讀入緩沖區(qū)時,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)。

2、阻塞與非阻塞IO

Java IO的各種流是阻塞的。這意味著,當一個線程調(diào)用read() 或 write()時,該線程被阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了。

Java NIO的非阻塞模式,使一個線程從某通道發(fā)送請求讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時,就什么都不會獲取,而不是保持線程阻塞,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)。

3、選擇器(Selectors)

Java NIO的選擇器允許一個單獨的線程來監(jiān)視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

三、NIO和IO如何影響應(yīng)用程序的設(shè)計

無論您選擇IO或NIO工具箱,可能會影響您應(yīng)用程序設(shè)計的以下幾個方面:

1.對NIO或IO類的API調(diào)用。
2.數(shù)據(jù)處理。
3.用來處理數(shù)據(jù)的線程數(shù)。

1、API調(diào)用

當然,使用NIO的API調(diào)用時看起來與使用IO時有所不同,但這并不意外,因為并不是僅從一個InputStream逐字節(jié)讀取,而是數(shù)據(jù)必須先讀入緩沖區(qū)再處理。

2、數(shù)據(jù)處理

使用純粹的NIO設(shè)計相較IO設(shè)計,數(shù)據(jù)處理也受到影響。

在IO設(shè)計中,我們從InputStream或 Reader逐字節(jié)讀取數(shù)據(jù)。假設(shè)你正在處理一基于行的文本數(shù)據(jù)流,例如:

面試官:談?wù)勀銓O流和NIO的理解

該文本行的流可以這樣處理:

面試官:談?wù)勀銓O流和NIO的理解

???? 請注意處理狀態(tài)由程序執(zhí)行多久決定。換句話說,一旦reader.readLine()方法返回,你就知道肯定文本行就已讀完, readline()阻塞直到整行讀完,這就是原因。你也知道此行包含名稱;同樣,第二個readline()調(diào)用返回的時候,你知道這行包含年齡等。 正如你可以看到,該處理程序僅在有新數(shù)據(jù)讀入時運行,并知道每步的數(shù)據(jù)是什么。一旦正在運行的線程已處理過讀入的某些數(shù)據(jù),該線程不會再回退數(shù)據(jù)(大多如此)。下圖也說明了這條原則:

而一個NIO的實現(xiàn)會有所不同,下面是一個簡單的例子:

面試官:談?wù)勀銓O流和NIO的理解

注意第二行,從通道讀取字節(jié)到ByteBuffer。當這個方法調(diào)用返回時,你不知道你所需的所有數(shù)據(jù)是否在緩沖區(qū)內(nèi)。你所知道的是,該緩沖區(qū)包含一些字節(jié),這使得處理有點困難。假設(shè)第一次 read(buffer)調(diào)用后,讀入緩沖區(qū)的數(shù)據(jù)只有半行,例如,“Name:An”,你能處理數(shù)據(jù)嗎?顯然不能,需要等待,直到整行數(shù)據(jù)讀入緩存,在此之前,對數(shù)據(jù)的任何處理毫無意義。所以,你怎么知道是否該緩沖區(qū)包含足夠的數(shù)據(jù)可以處理呢?好了,你不知道。發(fā)現(xiàn)的方法只能查看緩沖區(qū)中的數(shù)據(jù)。其結(jié)果是,在你知道所有數(shù)據(jù)都在緩沖區(qū)里之前,你必須檢查幾次緩沖區(qū)的數(shù)據(jù)。這不僅效率低下,而且可以使程序設(shè)計方案雜亂不堪。例如

面試官:談?wù)勀銓O流和NIO的理解

bufferFull()方法必須跟蹤有多少數(shù)據(jù)讀入緩沖區(qū),并返回真或假,這取決于緩沖區(qū)是否已滿。換句話說,如果緩沖區(qū)準備好被處理,那么表示緩沖區(qū)滿了。

bufferFull()方法掃描緩沖區(qū),但必須保持在bufferFull()方法被調(diào)用之前狀態(tài)相同。如果沒有,下一個讀入緩沖區(qū)的數(shù)據(jù)可能無法讀到正確的位置。這是不可能的,但卻是需要注意的又一問題。

如果緩沖區(qū)已滿,它可以被處理。如果它不滿,并且在你的實際案例中有意義,你或許能處理其中的部分數(shù)據(jù)。但是許多情況下并非如此。

四、IO與NIO的選擇

NIO可讓您只使用一個(或幾個)單線程管理多個通道(網(wǎng)絡(luò)連接或文件),但付出的代價是解析數(shù)據(jù)可能會比從一個阻塞流中讀取數(shù)據(jù)更復(fù)雜。

如果需要管理同時打開的成千上萬個連接,這些連接每次只是發(fā)送少量的數(shù)據(jù),例如聊天服務(wù)器,實現(xiàn)NIO的服務(wù)器可能是一個優(yōu)勢。同樣,如果你需要維持許多打開的連接到其他計算機上,如P2P網(wǎng)絡(luò)中,使用一個單獨的線程來管理你所有出站連接,可能是一個優(yōu)勢。一個線程多個連接的設(shè)計方案如下圖所示:

Java NIO:?單線程管理多個連接

如果你有少量的連接使用非常高的帶寬,一次發(fā)送大量的數(shù)據(jù),也許典型的IO服務(wù)器實現(xiàn)可能非常契合。下圖說明了一個典型的IO服務(wù)器設(shè)計:

Java IO:?一個典型的IO服務(wù)器設(shè)計- 一個連接通過一個線程處理.

PS.

1.?? Java IO 流中涉及到了哪些設(shè)計策略和設(shè)計模式

Java 的 IO 庫提供了一種鏈接(Chaining)機制,可以將一個流處理器跟另一個流處理器首尾相接,以其中之一的輸出作為另一個的輸入而形成一個流管道鏈接,譬如常見的 new DataInputStream(new FileInputStream(file)) 就是把 FileInputStream 流當作 DataInputStream 流的管道鏈接。其次,對于 Java IO 流還涉及一種對稱性的設(shè)計策略,其表現(xiàn)為輸入輸出對稱性(如 InputStream 和 OutputStream 的字節(jié)輸入輸出操作,Reader 和 Writer 的字符輸入輸出操作)和字節(jié)字符的對稱性(InputStream 和 Reader 的字節(jié)字符輸入操作,OutputStream 和 Writer 的字節(jié)字符輸出操作)。此外,對于 Java IO 流在整體設(shè)計上還涉及裝飾者(Decorator)和適配器(Adapter)兩種設(shè)計模式。

對于 IO 流涉及的裝飾者設(shè)計模式例子如下:

//把InputStreamReader裝飾成BufferedReader來成為具備緩沖能力的Reader。BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

對于 IO 流涉及的適配器設(shè)計模式例子如下:

//把FileInputStream文件字節(jié)流適配成InputStreamReader字符流來操作文件字符串。

FileInputStream fileInput = new FileInputStream(file);

InputStreamReader inputStreamReader = new InputStreamReader(fileInput);

而對于上面涉及的兩種設(shè)計模式通俗總結(jié)如下。裝飾者模式就是給一個對象增加一些新的功能,而且是動態(tài)的,要求裝飾對象和被裝飾對象實現(xiàn)同一個接口,裝飾對象持有被裝飾對象的實例(各種字符流間裝飾,各種字節(jié)流間裝飾)。適配器模式就是將某個類的接口轉(zhuǎn)換成我們期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題(字符流與字節(jié)流間互相適配)。

2.?? 字節(jié)流與字符流有什么區(qū)別:

計算機中的一切最終都是以二進制字節(jié)形式存在的,對于我們經(jīng)常操作的字符串,在寫入時其實都是先得到了其對應(yīng)的字節(jié),然后將字節(jié)寫入到輸出流,在讀取時其實都是先讀到的是字節(jié),然后將字節(jié)直接使用或者轉(zhuǎn)換為字符給我們使用。由于對于字節(jié)和字符兩種操作的需求比較廣泛,所以 Java 專門提供了字符流與字節(jié)流相關(guān)IO類。對于程序運行的底層設(shè)備來說永遠都只接受字節(jié)數(shù)據(jù),所以當我們往設(shè)備寫數(shù)據(jù)時無論是字節(jié)還是字符最終都是寫的字節(jié)流。字符流是字節(jié)流的包裝類,所以當我們將字符流向字節(jié)流轉(zhuǎn)換時要注意編碼問題(因為字符串轉(zhuǎn)成字節(jié)數(shù)組的實質(zhì)是轉(zhuǎn)成該字符串的某種字節(jié)編碼)。字符流和字節(jié)流的使用非常相似,但是實際上字節(jié)流的操作不會經(jīng)過緩沖區(qū)(內(nèi)存)而是直接操作文本本身的,而字符流的操作會先經(jīng)過緩沖區(qū)(內(nèi)存)然后通過緩沖區(qū)再操作文件。

字符流和字節(jié)流的使用非常相似,但是實際上字節(jié)流的操作不會經(jīng)過緩沖區(qū)(內(nèi)存)而是直接操作文本本身的,而字符流的操作會先經(jīng)過緩沖區(qū)(內(nèi)存)然后通過緩沖區(qū)再操作文件。

3.??字節(jié)流和字符流哪個好,如何選擇?

緩大多數(shù)情況下使用字節(jié)流會更好,因為字節(jié)流是字符流的包裝,而大多數(shù)時候 IO 操作都是直接操作磁盤文件,所以這些流在傳輸時都是以字節(jié)的方式進行的(圖片等都是按字節(jié)存儲的)。

而如果對于操作需要通過 IO 在內(nèi)存中頻繁處理字符串的情況使用字符流會好些,因為字符流具備緩沖區(qū),提高了性能。


本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹記這一點。同時我經(jīng)過多年的收藏目前也算收集到了一套完整的學(xué)習資料,包括但不限于:分布式架構(gòu)、高可擴展、高性能、高并發(fā)、Jvm性能調(diào)優(yōu)、Spring,MyBatis,Nginx源碼分析,redis,ActiveMQ、、Mycat、Netty、Kafka、MySQL、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階干貨,希望對想成為架構(gòu)師的朋友有一定的參考和幫助

需要更詳細思維導(dǎo)圖和以下資料的可以加一下技術(shù)交流分享群:“708 701 457”免費獲取

面試官:談?wù)勀銓O流和NIO的理解
面試官:談?wù)勀銓O流和NIO的理解
面試官:談?wù)勀銓O流和NIO的理解
面試官:談?wù)勀銓O流和NIO的理解

網(wǎng)站名稱:面試官:談?wù)勀銓O流和NIO的理解
轉(zhuǎn)載來源:http://jinyejixie.com/article14/gcioge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站營銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
鄄城县| 泸西县| 松潘县| 东明县| 通城县| 天水市| 鞍山市| 冀州市| 文水县| 葫芦岛市| 通许县| 盐津县| 麻栗坡县| 周至县| 高要市| 金湖县| 巴彦淖尔市| 禄丰县| 奉新县| 通州区| 通海县| 射阳县| 若尔盖县| 隆子县| 海盐县| 武安市| 云龙县| 西丰县| 嘉鱼县| 太原市| 嵊泗县| 云阳县| 奎屯市| 东丽区| 临猗县| 周口市| 石泉县| 靖边县| 岳普湖县| 本溪市| 林西县|