2022年Java面試寶典- IO篇

很多同學(xué)想知道企業(yè)在招聘Java工程師時(shí)會(huì)提問哪些問題,匯總歷屆學(xué)員求職經(jīng)驗(yàn)并與企業(yè)溝通之后總結(jié)出《Java面試寶典》,涵蓋Java基礎(chǔ)辐赞、設(shè)計(jì)模式以及Java框架等考察點(diǎn)括享,一碼當(dāng)先搂根,學(xué)員月薪過萬不是夢(mèng)!

/1.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é)文件本砰。

java中的阻塞式方法是指在程序調(diào)用改方法時(shí)碴裙,必須等待輸入數(shù)據(jù)可用或者檢測(cè)到輸入結(jié)束或者拋出異常,否則程序會(huì)一直停留在該語句上点额,不會(huì)執(zhí)行下面的語句舔株。比如read()和readLine()方法。

2.談?wù)剬?duì)NIO的認(rèn)知还棱?

對(duì)于NIO载慈,它是非阻塞式,核心類:

1.Buffer為所有的原始類型提供 (Buffer)緩存支持珍手。

2.Charset字符集編碼解碼解決方案

3.Channel一個(gè)新的原始 I/O抽象办铡,用于讀寫B(tài)uffer類型,通道可以認(rèn)為是一種連接琳要,可以是到特定設(shè)備寡具,程序或者是網(wǎng)絡(luò)的連接。

3.字節(jié)流和字符流的區(qū)別稚补?

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

以字節(jié)為單位輸入輸出數(shù)據(jù)课幕,字節(jié)流按照8位傳輸

以字符為單位輸入輸出數(shù)據(jù)拯钻,字符流按照16位傳輸

4.NIO和傳統(tǒng)的IO有什么區(qū)別帖努?

1、傳統(tǒng)IO一般是一個(gè)線程等待連接粪般,連接過來之后分配給processor線程拼余,processor線程與通道連接后如果通道沒有數(shù)據(jù)過來就會(huì)阻塞(線程被動(dòng)掛起)不能做別的事情。NIO則不同亩歹,首先匙监,在selector線程輪詢的過程中就已經(jīng)過濾掉了不感興趣的事件,其次小作,在processor處理感興趣事件的read和write都是非阻塞操作即直接返回的亭姥,線程沒有被掛起。

2顾稀、傳統(tǒng)io的管道是單向的达罗,nio的管道是雙向的。

3静秆、兩者都是同步的粮揉,也就是java程序親力親為的去讀寫數(shù)據(jù),不管傳統(tǒng)io還是nio都需要read和write方法抚笔,這些都是java程序調(diào)用的而不是系統(tǒng)幫我們調(diào)用的扶认,nio2.0里這點(diǎn)得到了改觀,即使用異步非阻塞AsynchronousXXX四個(gè)類來處理殊橙。

5.BIO和NIO和AIO的區(qū)別以及應(yīng)用場(chǎng)景辐宾?

同步:java自己去處理io。

異步:java將io交給操作系統(tǒng)去處理膨蛮,告訴緩存區(qū)大小叠纹,處理完成回調(diào)。

阻塞:使用阻塞IO時(shí)敞葛,Java調(diào)用會(huì)一直阻塞到讀寫完成才返回吊洼。

非阻塞:使用非阻塞IO時(shí),如果不能立馬讀寫制肮,Java調(diào)用會(huì)馬上返回冒窍,當(dāng)IO事件分發(fā)器通知可讀寫時(shí)在進(jìn)行讀寫,不斷循環(huán)直到讀寫完成豺鼻。

BIO:同步并阻塞综液,服務(wù)器的實(shí)現(xiàn)模式是一個(gè)連接一個(gè)線程,這樣的模式很明顯的一個(gè)缺陷是:由于客戶端連接數(shù)與服務(wù)器線程數(shù)成正比關(guān)系儒飒,可能造成不必要的線程開銷谬莹,嚴(yán)重的還將導(dǎo)致服務(wù)器內(nèi)存溢出。當(dāng)然,這種情況可以通過線程池機(jī)制改善附帽,但并不能從本質(zhì)上消除這個(gè)弊端埠戳。

NIO:在JDK1.4以前,Java的IO模型一直是BIO蕉扮,但從JDK1.4開始整胃,JDK引入的新的IO模型NIO,它是同步非阻塞的喳钟。而服務(wù)器的實(shí)現(xiàn)模式是多個(gè)請(qǐng)求一個(gè)線程屁使,即請(qǐng)求會(huì)注冊(cè)到多路復(fù)用器Selector上,多路復(fù)用器輪詢到連接有IO請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程處理奔则。

AIO:JDK1.7發(fā)布了NIO2.0蛮寂,這就是真正意義上的異步非阻塞,服務(wù)器的實(shí)現(xiàn)模式為多個(gè)有效請(qǐng)求一個(gè)線程易茬,客戶端的IO請(qǐng)求都是由OS先完成再通知服務(wù)器應(yīng)用去啟動(dòng)線程處理(回調(diào))酬蹋。

應(yīng)用場(chǎng)景:并發(fā)連接數(shù)不多時(shí)采用BIO,因?yàn)樗幊毯驼{(diào)試都非常簡(jiǎn)單抽莱,但如果涉及到高并發(fā)的情況范抓,應(yīng)選擇NIO或AIO,更好的建議是采用成熟的網(wǎng)絡(luò)通信框架Netty岸蜗。

6.什么是Java序列化尉咕,如何實(shí)現(xiàn)Java序列化叠蝇?

序列化就是一種用來處理對(duì)象流的機(jī)制璃岳,將對(duì)象的內(nèi)容進(jìn)行流化』诖罚可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作铃慷,可以將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)象流讀寫操作時(shí)所引發(fā)的問題

序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serialize接口蜕该,沒有需要實(shí)現(xiàn)的方法犁柜,此接口只是為了標(biāo)注對(duì)象可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對(duì)象流)對(duì)象堂淡,再使用ObjectOutputStream對(duì)象的write(Object obj)方法就可以將參數(shù)obj的對(duì)象寫出

7.PrintStream馋缅、BufferedWriter、PrintWriter的比較绢淀?

PrintStream類的輸出功能非常強(qiáng)大萤悴,通常如果需要輸出文本內(nèi)容,都應(yīng)該將輸出流包裝成PrintStream后進(jìn)行輸出皆的。它還提供其他兩項(xiàng)功能覆履。與其他輸出流不同,PrintStream 永遠(yuǎn)不會(huì)拋出 IOException;而是硝全,異常情況僅設(shè)置可通過 checkError 方法測(cè)試的內(nèi)部標(biāo)志栖雾。另外,為了自動(dòng)刷新伟众,可以創(chuàng)建一個(gè) PrintStream

2析藕、BufferedWriter:將文本寫入字符輸出流,緩沖各個(gè)字符從而提供單個(gè)字符赂鲤,數(shù)組和字符串的高效寫入噪径。通過write()方法可以將獲取到的字符輸出,然后通過newLine()進(jìn)行換行操作数初。BufferedWriter中的字符流必須通過調(diào)用flush方法才能將其刷出去找爱。并且BufferedWriter只能對(duì)字符流進(jìn)行操作。如果要對(duì)字節(jié)流操作泡孩,則使用BufferedInputStream

3车摄、PrintWriter的println方法自動(dòng)添加換行,不會(huì)拋異常仑鸥,若關(guān)心異常吮播,需要調(diào)用checkError方法看是否有異常發(fā)生,PrintWriter構(gòu)造方法可指定參數(shù)眼俊,實(shí)現(xiàn)自動(dòng)刷新緩存(autoflush)

8.什么是節(jié)點(diǎn)流意狠,什么是處理流,各有什么好處疮胖,處理流的創(chuàng)建有什么特征环戈?

節(jié)點(diǎn)流 直接與數(shù)據(jù)源相連,用于輸入或者輸出

處理流:在節(jié)點(diǎn)流的基礎(chǔ)上對(duì)之進(jìn)行加工澎灸,進(jìn)行一些功能的擴(kuò)展

處理流的構(gòu)造器必須要 傳入節(jié)點(diǎn)流的子類

9.什么是IO流院塞?

它是一種數(shù)據(jù)的流從源頭流到目的地。比如文件拷貝性昭,輸入流和輸出流都包括了拦止。輸入流從文件中讀取數(shù)據(jù)存儲(chǔ)到進(jìn)程(process)中,輸出流從進(jìn)程中讀取數(shù)據(jù)然后寫入到目標(biāo)文件糜颠。

10.有哪些可用的Filter流汹族?

http://java.io包中主要由4個(gè)可用的filter Stream。兩個(gè)字節(jié)filter stream其兴,兩個(gè)字符filter stream. 分別是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.這些類是抽象類顶瞒,不能被實(shí)例化的。

11.Java中有幾種類型的流忌警?

按照流的方向:輸入流(inputStream)和輸出流(outputStream)

按照實(shí)現(xiàn)功能分:節(jié)點(diǎn)流(可以從或向一個(gè)特定的地方(節(jié)點(diǎn))讀寫數(shù)據(jù)搁拙。如 FileReader)和處理流(是對(duì)一個(gè)已存在的流的連接和封裝秒梳,通過所封裝的流的功能調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀寫。如 BufferedReader箕速。處理流的構(gòu)造方法總是要帶一個(gè)其他的流對(duì)象做參數(shù)酪碘。一個(gè)流對(duì)象經(jīng)過其他流的多次包裝,稱為流的鏈接盐茎。)

按照處理數(shù)據(jù)的單位: 字節(jié)流和字符流兴垦。字節(jié)流繼承于 InputStream 和 OutputStream, 字符流繼承于InputStreamReader 和 OutputStreamWriter 字柠。

12.如何實(shí)現(xiàn)對(duì)象克绿皆健?

有兩種方式:

1). 實(shí)現(xiàn)Cloneable接口并重寫Object類中的clone()方法窑业;

2). 實(shí)現(xiàn)Serializable接口钦幔,通過對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆,可以實(shí)現(xiàn)真正的深度克隆

13.什么是緩沖區(qū)常柄?有什么作用鲤氢?

緩沖區(qū)就是一段特殊的內(nèi)存區(qū)域,很多情況下當(dāng)程序需要頻繁地操作一個(gè)資源(如文件或數(shù)據(jù)庫)則性能會(huì)很低西潘,所以為了提升性能就可以將一部分?jǐn)?shù)據(jù)暫時(shí)讀寫到緩存區(qū)卷玉,以后直接從此區(qū)域中讀寫數(shù)據(jù)即可,這樣就可以顯著的提升性能喷市。

對(duì)于 Java 字符流的操作都是在緩沖區(qū)操作的相种,所以如果我們想在字符流操作中主動(dòng)將緩沖區(qū)刷新到文件則可以使用 flush() 方法操作。

14.什么是阻塞IO品姓?什么是非阻塞IO寝并?

IO操作包括:對(duì)硬盤的讀寫、對(duì)socket的讀寫以及外設(shè)的讀寫缭黔。

當(dāng)用戶線程發(fā)起一個(gè)IO請(qǐng)求操作(本文以讀請(qǐng)求操作為例)食茎,內(nèi)核會(huì)去查看要讀取的數(shù)據(jù)是否就緒蒂破,對(duì)于阻塞IO來說馏谨,如果數(shù)據(jù)沒有就緒,則會(huì)一直在那等待附迷,直到數(shù)據(jù)就緒惧互;對(duì)于非阻塞IO來說,如果數(shù)據(jù)沒有就緒喇伯,則會(huì)返回一個(gè)標(biāo)志信息告知用戶線程當(dāng)前要讀的數(shù)據(jù)沒有就緒喊儡。當(dāng)數(shù)據(jù)就緒之后,便將數(shù)據(jù)拷貝到用戶線程稻据,這樣才完成了一個(gè)完整的IO讀請(qǐng)求操作艾猜,也就是說一個(gè)完整的IO讀請(qǐng)求操作包括兩個(gè)階段:

1)查看數(shù)據(jù)是否就緒;

2)進(jìn)行數(shù)據(jù)拷貝(內(nèi)核將數(shù)據(jù)拷貝到用戶線程)。

那么阻塞(blocking IO)和非阻塞(non-blocking IO)的區(qū)別就在于第一個(gè)階段匆赃,如果數(shù)據(jù)沒有就緒淤毛,在查看數(shù)據(jù)是否就緒的過程中是一直等待,還是直接返回一個(gè)標(biāo)志信息算柳。

Java中傳統(tǒng)的IO都是阻塞IO低淡,比如通過socket來讀數(shù)據(jù),調(diào)用read()方法之后瞬项,如果數(shù)據(jù)沒有就緒蔗蹋,當(dāng)前線程就會(huì)一直阻塞在read方法調(diào)用那里,直到有數(shù)據(jù)才返回囱淋;而如果是非阻塞IO的話猪杭,當(dāng)數(shù)據(jù)沒有就緒,read()方法應(yīng)該返回一個(gè)標(biāo)志信息妥衣,告知當(dāng)前線程數(shù)據(jù)沒有就緒胁孙,而不是一直在那里等待。

需要領(lǐng)取大廠面試資料的小伙伴們称鳞,私信回復(fù)“需要”涮较,即可免費(fèi)領(lǐng)取哦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冈止,一起剝皮案震驚了整個(gè)濱河市狂票,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熙暴,老刑警劉巖闺属,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異周霉,居然都是意外死亡掂器,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門俱箱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国瓮,“玉大人,你說我怎么就攤上這事狞谱∧四。” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵跟衅,是天一觀的道長孵睬。 經(jīng)常有香客問我,道長伶跷,這世上最難降的妖魔是什么掰读? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任秘狞,我火速辦了婚禮,結(jié)果婚禮上蹈集,老公的妹妹穿的比我還像新娘谒撼。我一直安慰自己,他們只是感情好雾狈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布廓潜。 她就那樣靜靜地躺著,像睡著了一般善榛。 火紅的嫁衣襯著肌膚如雪辩蛋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天移盆,我揣著相機(jī)與錄音悼院,去河邊找鬼。 笑死咒循,一個(gè)胖子當(dāng)著我的面吹牛据途,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叙甸,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颖医,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了裆蒸?” 一聲冷哼從身側(cè)響起熔萧,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僚祷,沒想到半個(gè)月后佛致,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辙谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年俺榆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片装哆。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罐脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烂琴,到底是詐尸還是另有隱情爹殊,我是刑警寧澤蜕乡,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布奸绷,位于F島的核電站,受9級(jí)特大地震影響层玲,放射性物質(zhì)發(fā)生泄漏号醉。R本人自食惡果不足惜反症,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畔派。 院中可真熱鬧铅碍,春花似錦、人聲如沸线椰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憨愉。三九已至烦绳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間配紫,已是汗流浹背径密。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺孝,地道東北人享扔。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像植袍,于是被迫代替她去往敵國和親惧眠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容