欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

04.JavaIO流問題

目錄介紹
  • 4.0.0.1 說一下Java IO里面的常見類,字節(jié)流,字符流、接口、實(shí)現(xiàn)類、方法阻塞?
  • 4.0.0.2 什么是比特(Bit),什么是字節(jié)(Byte),什么是字符(Char),它們長度是多少,各有什么區(qū)別?
  • 4.0.0.3 字符流和字節(jié)流有什么區(qū)別?如何選擇字節(jié)流或者字符流?什么是緩沖區(qū),有什么作用?
  • 4.0.0.4 IO流中用到哪些模式?談一談IO流中用到的適配器模式和裝飾者模式的作用優(yōu)勢?
  • 4.0.0.5 說一下對NIO的理解?NIO和IO的主要區(qū)別?NIO和IO如何影響應(yīng)用程序的設(shè)計(jì)?
  • 4.0.1.1 對字節(jié)流進(jìn)行大量的從硬盤讀取,要用那個(gè)流,為什么?

好消息

  • 博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客,從12年起,積累共計(jì)500篇[近100萬字],將會陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請注明出處,謝謝!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬事起于忽微,量變引起質(zhì)變!所有博客將陸續(xù)開源到GitHub!
4.0.0.1 說一下Java IO里面的常見類,字節(jié)流,字符流、接口、實(shí)現(xiàn)類、方法阻塞?
  • 輸出流和輸入流
    • 輸入流就是從外部文件輸入到內(nèi)存,輸出流主要是從內(nèi)存輸出到文件。
  • IO里面常見的類
    • IO流中有很多類,IO流主要分為字符流和字節(jié)流。字符流中有抽象類InputStream和OutputStream,它們的子類FileInputStream,F(xiàn)ileOutputStream,BufferedOutputStream等。字符流BufferedReader和Writer等。都實(shí)現(xiàn)了Closeable, Flushable, Appendable這些接口。程序中的輸入輸出都是以流的形式保存的,流中保存的實(shí)際上全都是字節(jié)文件。
  • IO流中方法阻塞
    • java中的阻塞式方法是指在程序調(diào)用改方法時(shí),必須等待輸入數(shù)據(jù)可用或者檢測到輸入結(jié)束或者拋出異常,否則程序會一直停留在該語句上,不會執(zhí)行下面的語句。比如read()和readLine()方法。
    • 技術(shù)博客大總結(jié)
4.0.0.2 什么是比特(Bit),什么是字節(jié)(Byte),什么是字符(Char),它們長度是多少,各有什么區(qū)別?
  • 什么是比特(Bit)?
    • Bit最小的二進(jìn)制單位 ,是計(jì)算機(jī)的操作部分 取值0或者1
  • 什么是字節(jié)
    • Byte是計(jì)算機(jī)操作數(shù)據(jù)的最小單位由8位bit組成 取值(-128-127)
  • 什么是字符
    • Char是用戶的可讀寫的最小單位,在Java里面由16位bit組成 取值(0-65535)
  • 各有什么區(qū)別
    • Bit 是最小單位 計(jì)算機(jī) 只能認(rèn)識 0或者1
4.0.0.3 字符流和字節(jié)流有什么區(qū)別?如何選擇字節(jié)流或者字符流?什么是緩沖區(qū),有什么作用?
  • 字符流和字節(jié)流區(qū)別
    • 把二進(jìn)制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個(gè)設(shè)備中,或者從某個(gè)設(shè)備中逐一讀取一片二進(jìn)制數(shù)據(jù),不管輸入輸出設(shè)備是什么,我們要用統(tǒng)一的方式來完成這些操作,用一種抽象的方式進(jìn)行描述,這個(gè)抽象描述方式起名為IO流,對應(yīng)的抽象類為OutputStream和InputStream ,不同的實(shí)現(xiàn)類就代表不同的輸入和輸出設(shè)備,它們都是針對字節(jié)進(jìn)行操作的。
    • 在應(yīng)用中,經(jīng)常要完全是字符的一段文本輸出去或讀進(jìn)來,用字節(jié)流可以嗎?計(jì)算機(jī)中的一切最終都是二進(jìn)制的字節(jié)形式存在。對于“中國”這些字符,首先要得到其對應(yīng)的字節(jié),然后將字節(jié)寫入到輸出流。讀取時(shí),首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,人家專門提供了字符流的包裝類。
    • 底層設(shè)備永遠(yuǎn)只接受字節(jié)數(shù)據(jù),有時(shí)候要寫字符串到底層設(shè)備,需要將字符串轉(zhuǎn)成字節(jié)再進(jìn)行寫入。字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫入底層設(shè)備,這為我們向IO設(shè)別寫入或讀取字符串提供了一點(diǎn)點(diǎn)方便。
    • 技術(shù)博客大總結(jié)
    • 字符流和字節(jié)流的使用非常相似,但是實(shí)際上字節(jié)流的操作不會經(jīng)過緩沖區(qū)(內(nèi)存)而是直接操作文本本身的,而字符流的操作會先經(jīng)過緩沖區(qū)(內(nèi)存)然后通過緩沖區(qū)再操作文件。
  • 如何選擇字節(jié)流或者字符流?
    • 字符流是由Java虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個(gè)字節(jié)的Unicode字符為單位的字符而成的
    • 如果是音頻文件、圖片、歌曲,就用字節(jié)流好點(diǎn)(避免數(shù)據(jù)丟失)
    • 如果是關(guān)系到中文(文本)的,用字符流好點(diǎn))
  • 什么是緩沖區(qū),有什么作用?
    • 緩沖區(qū)就是一段特殊的內(nèi)存區(qū)域,很多情況下當(dāng)程序需要頻繁地操作一個(gè)資源(如文件或數(shù)據(jù)庫)則性能會很低,所以為了提升性能就可以將一部分?jǐn)?shù)據(jù)暫時(shí)讀寫到緩存區(qū),以后直接從此區(qū)域中讀寫數(shù)據(jù)即可,這樣就顯著提升了性能。
    • 對于 Java 字符流的操作都是在緩沖區(qū)操作的,所以如果我們想在字符流操作中主動(dòng)將緩沖區(qū)刷新到文件則可以使用 flush() 方法操作。
4.0.0.4 IO流中用到哪些模式?談一談IO流中用到的適配器模式和裝飾者模式的作用優(yōu)勢?
  • IO流中用到哪些模式
    • 大概有裝飾者模式和適配器模式!
    • 要知道裝飾者模式和適配器模式的作用;其次,可以自己舉個(gè)例子把它的作用生動(dòng)形象地講出來;最后,簡要說一下要完成這樣的功能需要什么樣的條件。
  • 談一談IO流中用到的適配器模式和裝飾者模式的作用優(yōu)勢
    • 裝飾器模式:就是動(dòng)態(tài)地給一個(gè)對象添加一些額外的職責(zé)(對于原有功能的擴(kuò)展)。
      //把InputStreamReader裝飾成BufferedReader來成為具備緩沖能力的Reader。
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      • 1.它必須持有一個(gè)被裝飾的對象(作為成員變量)。
      • 2.它必須擁有與被裝飾對象相同的接口(多態(tài)調(diào)用、擴(kuò)展需要)。
      • 3.它可以給被裝飾對象添加額外的功能。
      • 比如,在io流中,F(xiàn)ilterInputStream類就是裝飾角色,它實(shí)現(xiàn)了InputStream類的所有接口,并持有InputStream的對象實(shí)例的引用,BufferedInputStream是具體的裝飾器實(shí)現(xiàn)者,這個(gè)裝飾器類的作用就是使得InputStream讀取的數(shù)據(jù)保存在內(nèi)存中,而提高讀取的性能。
    • 適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,讓原本不兼容的接口可以合作無間。
      //把FileInputStream文件字節(jié)流適配成InputStreamReader字符流來操作文件字符串。
      FileInputStream fileInput = new FileInputStream(file); 
      InputStreamReader inputStreamReader = new InputStreamReader(fileInput);
      • 1.適配器對象實(shí)現(xiàn)原有接口
      • 2.適配器對象組合一個(gè)實(shí)現(xiàn)新接口的對象
      • 3.對適配器原有接口方法的調(diào)用被委托給新接口的實(shí)例的特定方法(重寫舊接口方法來調(diào)用新接口功能。)
      • 比如,在io流中,InputStreamReader類繼承了Reader接口,但要?jiǎng)?chuàng)建它必須在構(gòu)造函數(shù)中傳入一個(gè)InputStream的實(shí)例,InputStreamReader的作用也就是將InputStream適配到Reader。InputStreamReader實(shí)現(xiàn)了Reader接口,并且持有了InputStream的引用。這里,適配器就是InputStreamReader類,而源角色就是InputStream代表的實(shí)例對象,目標(biāo)接口就是Reader類。
      • 適配器模式主要在于將一個(gè)接口轉(zhuǎn)變成另一個(gè)接口,它的目的是通過改變接口來達(dá)到重復(fù)使用的目的;而裝飾器模式不是要改變被裝飾對象的接口,而是保持原有的接口,但是增強(qiáng)原有對象的功能,或改變原有對象的方法而提高性能。
  • 用到設(shè)計(jì)模式優(yōu)勢
    • 裝飾者模式就是給一個(gè)對象增加一些新的功能,而且是動(dòng)態(tài)的,要求裝飾對象和被裝飾對象實(shí)現(xiàn)同一個(gè)接口,裝飾對象持有被裝飾對象的實(shí)例(各種字符流間裝飾,各種字節(jié)流間裝飾)。
    • 技術(shù)博客大總結(jié)
    • 適配器模式就是將某個(gè)類的接口轉(zhuǎn)換成我們期望的另一個(gè)接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題(字符流與字節(jié)流間互相適配)。
4.0.0.5 說一下對NIO的理解?NIO和IO的主要區(qū)別?NIO和IO如何影響應(yīng)用程序的設(shè)計(jì)?
  • 說一下對NIO的理解?
    • 傳統(tǒng)的IO流是阻塞式的,會一直監(jiān)聽一個(gè)ServerSocket,在調(diào)用read等方法時(shí),它會一直等到數(shù)據(jù)到來或者緩沖區(qū)已滿時(shí)才返回。調(diào)用accept也是一直阻塞到有客戶端連接才會返回。每個(gè)客戶端連接過來后,服務(wù)端都會啟動(dòng)一個(gè)線程去處理該客戶端的請求。并且多線程處理多個(gè)連接。每個(gè)線程擁有自己的??臻g并且占用一些CPU時(shí)間。每個(gè)線程遇到外部未準(zhǔn)備好的時(shí)候,都會阻塞掉。阻塞的結(jié)果就是會帶來大量的進(jìn)程上下文切換。
    • 對于NIO,它是非阻塞式,核心類:
      • 1.Buffer為所有的原始類型提供 (Buffer)緩存支持。
      • 2.Charset字符集編碼解碼解決方案
      • 3.Channel一個(gè)新的原始I/O抽象,用于讀寫B(tài)uffer類型,通道可以認(rèn)為是一種連接,可以是到特定設(shè)備,程序或者是網(wǎng)絡(luò)的連接。
  • NIO和IO的主要區(qū)別?
    • 主要區(qū)別
      IO  NIO
      面向流     面向緩沖
      阻塞IO    非阻塞IO
      無   選擇器
    • 面向流與面向緩沖
      • Java IO和NIO之間第一個(gè)最大的區(qū)別是,IO是面向流的,NIO是面向緩沖區(qū)的。JavaIO面向流意味著每次從流中讀一個(gè)或多個(gè)字節(jié),直至讀取所有字節(jié),它們沒有被緩存在任何地方。此外,它不能前后移動(dòng)流中的數(shù)據(jù)。如果需要前后移動(dòng)從流中讀取的數(shù)據(jù),需要先將它緩存到一個(gè)緩沖區(qū)。JavaNIO的緩沖導(dǎo)向方法略有不同。數(shù)據(jù)讀取到一個(gè)它稍后處理的緩沖區(qū),需要時(shí)可在緩沖區(qū)中前后移動(dòng)。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)。而且,需確保當(dāng)更多的數(shù)據(jù)讀入緩沖區(qū)時(shí),不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)。
    • 阻塞與非阻塞IO
      • Java IO的各種流是阻塞的。這意味著,當(dāng)一個(gè)線程調(diào)用read()或write()時(shí),該線程被阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了。JavaNIO的非阻塞模式,使一個(gè)線程從某通道發(fā)送請求讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時(shí),就什么都不會獲取,而不是保持線程阻塞,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情。非阻塞寫也是如此。一個(gè)線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入,這個(gè)線程同時(shí)可以去做別的事情。線程通常將非阻塞IO的空閑時(shí)間用于在其它通道上執(zhí)行IO操作,所以一個(gè)單獨(dú)的線程現(xiàn)在可以管理多個(gè)輸入和輸出通道(channel)。
    • 選擇器
      • Java NIO的選擇器允許一個(gè)單獨(dú)的線程來監(jiān)視多個(gè)輸入通道,你可以注冊多個(gè)通道使用一個(gè)選擇器,然后使用一個(gè)單獨(dú)的線程來“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已準(zhǔn)備寫入的通道。這種選擇機(jī)制,使得一個(gè)單獨(dú)的線程很容易來管理多個(gè)通道。
  • NIO和IO如何影響應(yīng)用程序的設(shè)計(jì)?
    • 無論您選擇IO或NIO工具箱,可能會影響您應(yīng)用程序設(shè)計(jì)的以下幾個(gè)方面:技術(shù)博客大總結(jié)
      • 1.對NIO或IO類的API調(diào)用。
      • 2.數(shù)據(jù)處理。
      • 3.用來處理數(shù)據(jù)的線程數(shù)。
    • API調(diào)用
      • 當(dāng)然,使用NIO的API調(diào)用時(shí)看起來與使用IO時(shí)有所不同,但這并不意外,因?yàn)椴⒉皇莾H從一個(gè)InputStream逐字節(jié)讀取,而是數(shù)據(jù)必須先讀入緩沖區(qū)再處理。
    • 數(shù)據(jù)處理
      • 使用純粹的NIO設(shè)計(jì)相較IO設(shè)計(jì),數(shù)據(jù)處理也受到影響。在IO設(shè)計(jì)中,我們從InputStream或 Reader逐字節(jié)讀取數(shù)據(jù)。
      • 請注意處理狀態(tài)由程序執(zhí)行多久決定。換句話說,一旦reader.readLine()方法返回,你就知道肯定文本行就已讀完, readline()阻塞直到整行讀完,這就是原因。你也知道此行包含名稱;同樣,第二個(gè)readline()調(diào)用返回的時(shí)候,你知道這行包含年齡等。正如你可以看到,該處理程序僅在有新數(shù)據(jù)讀入時(shí)運(yùn)行,并知道每步的數(shù)據(jù)是什么。一旦正在運(yùn)行的線程已處理過讀入的某些數(shù)據(jù),該線程不會再回退數(shù)據(jù)(大多如此)。
4.0.1.1 對字節(jié)流進(jìn)行大量的從硬盤讀取,要用那個(gè)流,為什么?
  • 對字節(jié)流進(jìn)行大量的從硬盤讀取,要用那個(gè)流,為什么?
    • 因?yàn)槊鞔_說了是對字節(jié)流的讀取,所以肯定是inputstream或者他的子類,又因?yàn)橐罅孔x取,肯定要考慮到高效的問題,自然想到緩沖流。技術(shù)博客大總結(jié)
    • 用BufferedInputStream,原因:BufferedInputStream是InputStream的緩沖流,使用它可以防止每次讀取數(shù)據(jù)時(shí)進(jìn)行實(shí)際的寫操作,代表著使用緩沖區(qū)。不帶緩沖的操作,每讀一個(gè)字節(jié)就要寫入一個(gè)字節(jié),由于涉及磁盤的IO操作相比內(nèi)存的操作要慢很多,所以不帶緩沖的流效率很低。帶緩沖的流,可以一次讀很多字節(jié),但不向磁盤中寫入,只是先放到內(nèi)存里。等湊夠了緩沖區(qū)大小的時(shí)候一次性寫入磁盤,這種方式可以減少磁盤操作次數(shù),速度就會提高很多!并且也可以減少對磁盤的損傷。

其他介紹

01.關(guān)于博客匯總鏈接
  • 1.技術(shù)博客匯總
  • 2.開源項(xiàng)目匯總
  • 3.生活博客匯總
  • 4.喜馬拉雅音頻匯總
  • 5.其他匯總
02.關(guān)于我的博客
  • 我的個(gè)人站點(diǎn):www.yczbj.org,www.ycbjie.cn
  • github:https://github.com/yangchong211
  • 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
  • 簡書:http://www.jianshu.com/u/b7b2c6ed9284
  • csdn:http://my.csdn.net/m0_37700275
  • 喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/
  • 開源中國:https://my.oschina.net/zbj1618/blog
  • 泡在網(wǎng)上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
  • 郵箱:yangchong211@163.com
  • 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
  • segmentfault頭條:https://segmentfault.com/u/xiangjianyu/articles
  • 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e

分享題目:04.JavaIO流問題
鏈接分享:http://chinadenli.net/article34/pehhse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、服務(wù)器托管軟件開發(fā)、網(wǎng)站導(dǎo)航網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)

廣告

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

成都seo排名網(wǎng)站優(yōu)化