【面試官】那Java字節(jié)流和字符流有什么區(qū)別?
- 面試官:你說(shuō)下對(duì)Java IO的理解?
- 面試官:那要怎么讀取字節(jié)流?
- 面試官:你說(shuō)的這些不是實(shí)例,我要的是能真正讀取的?
- 面試官:為什么加一層緩存流就能提高讀取效率?
- 面試官:讀取之后呢,我怎么知道文件讀取到末尾了?
- 面試官:那字符流讀取呢?
- 面試官:輸出流你也講一講?
- 面試官:那字節(jié)流和字符流有什么區(qū)別?
- 面試官:你剛剛提到轉(zhuǎn)換流把字節(jié)輸入流轉(zhuǎn)換成字符輸入流,可不可以倒過(guò)來(lái)?
大家好,我是南哥。
一個(gè)Java學(xué)習(xí)與進(jìn)階的領(lǐng)路人,跟著南哥我們一起Java成長(zhǎng)。
文章目錄
- IO的理解
- 輸入流
- 字節(jié)輸入流讀取方法
- 字節(jié)輸入流讀取實(shí)例
- 緩存流提高讀取效率
- 字節(jié)輸入流末尾
- 字符輸入流
- 輸出流
- 字節(jié)流和字符流區(qū)別
- 轉(zhuǎn)換流
1. IO的理解
面試官:你說(shuō)下對(duì)
Java IO
的理解?
好的面試官,Java IO有兩個(gè)參與對(duì)象,一個(gè)是IO源端,一個(gè)是想要和IO
源端通信的各種接收端如控制臺(tái)、文件等,我們程序要保證的就是順利的讀取和順利的寫(xiě)入。
2. 輸入流
2.1 字節(jié)輸入流讀取方法
面試官:那要怎么讀取字節(jié)流?
讀取字節(jié)的抽象基類(lèi)是InputStream,這個(gè)基類(lèi)提供了3個(gè)方法可以來(lái)讀取字節(jié)流。
-
從輸入流讀取下一個(gè)數(shù)據(jù)字節(jié),值字節(jié)以0到255范圍內(nèi)的
int
返回。public abstract int read() throws IOException
-
從輸入流讀取一定數(shù)量的字節(jié)并將它們存儲(chǔ)到緩沖區(qū)數(shù)組
b
中。public int read(byte b[]) throws IOException
-
從輸入流讀取最多
len
個(gè)字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組中。public int read(byte b[], int off, int len) throws IOException
2.2 字節(jié)輸入流讀取實(shí)例
面試官:你說(shuō)的這些不是實(shí)例,我要的是能真正讀取的?
那可以用抽象基類(lèi)的子類(lèi)實(shí)現(xiàn)來(lái)讀取,例如文件流FileInputStream。
new FileInputStream(SOURCE_PATH)
我們還可以在外面加一層緩存字節(jié)流來(lái)提高讀取效率。
new BufferedInputStream(new FileInputStream(SOURCE_PATH))
如果要把緩存流換成字符流來(lái)承接,方便使用readLine()讀取某一行的話,可以使用轉(zhuǎn)換流把字節(jié)輸入流轉(zhuǎn)換成字符輸入流。
new BufferedReader(new InputStreamReader(new FileInputStream(SOURCE_PATH)))
2.3 緩存流提高讀取效率
面試官:為什么加一層緩存流就能提高讀取效率?
是這樣的。因?yàn)橹苯邮褂?FileInputStream
讀取文件的話,每次調(diào)用 read()
都是從磁盤(pán)讀取一個(gè)字節(jié),而每次讀取都是一次系統(tǒng)調(diào)用。系統(tǒng)調(diào)用是操作系統(tǒng)層面的調(diào)用,涉及到用戶空間和內(nèi)核空間之間的上下文切換,這些切換是很昂貴的。
而如果使用緩存流,一次性從文件里讀取多個(gè)字節(jié)到緩存
剩余60%內(nèi)容,訂閱專(zhuān)欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
??以面試官面試的形式,涵蓋了你怒懟大廠面試官、拿下大廠面試所需掌握的核心知識(shí)、面試重點(diǎn)! ??相信一定對(duì)你順利通關(guān)面試、拿到理想Offer有所幫助! ??花費(fèi)大量精力去制作本專(zhuān)欄,創(chuàng)作不易,各位的支持就是我創(chuàng)作的最大動(dòng)力!