目錄介紹
- 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ū)別?
- 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)