天天看點

關于IO流的筆試面試題

1.java中有幾種類型的流?jdk為每種類型的流提供了一些抽象類以供繼承,請說出它們分别是什麼?

解題思路:了解io流的體系(重要)就可以了

從大的方面來分可以分為位元組流和字元流.字元流提供了提供了reader和writer;位元組流提供了outputstream 和inputstream.

2.字元流和位元組流有什麼差別?(重要)

解題思路:從讀寫的原理上來進行區分會好記一點(字元流處理的單元為 2 個位元組的 Unicode 字元,分别操作字元、字元數組或字元串;而位元組流處理單元為 1 個位元組,操作位元組和位元組數組。是以字元流是由Java虛拟機将位元組轉化為2個位元組的Unicode字元為機關的字元而成的,如果是音頻檔案、圖檔、歌曲,就用位元組流好點(避免資料丢失);如果是關系到中文(文本)的,用字元流好點)

字元流以字元或者字元數組的形式讀寫資料,隻能讀寫二進制檔案;位元組流能讀寫各種類型的資料.

3.什麼是java序列化,如何實作java序列化?(重要)

解題思路:像這樣的題,一般先做名詞解釋,然後闡述作用和使用方法

序列化就是一種用來處理對象流的機制,所謂對象流也就是将對象的内容進行流化(将對象轉換成二進制)。可以對流化後的對象進行讀寫操作,也可将流化後的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

注解:當兩個程序在進行遠端通信時,彼此可以發送各種類型的資料。無論是何種類型的資料,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換為位元組序列,才能在網絡上傳送;接收方則需要把位元組序列再恢複為Java對象。

  将需要序化的類實作Serializable接口就可以了,該接口沒有任何方法,可以了解為一個标記,即表明這個類可以序列化。注意的是被關鍵字static、transient修飾的變量不能被序列化。在被序列化後,transient修飾的變量會被設為初始值。如int型的是0、對象型的是null.

1.概念

  序列化:把Java對象轉換為位元組序列的過程。

  反序列化:把位元組序列恢複為Java對象的過程。

2.用途

對象的序列化主要有兩種用途:

1) 把對象的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;

2) 在網絡上傳送對象的位元組序列。

4.什麼是比特(Bit),什麼是位元組(Byte),什麼是字元(Char),它們長度是多少,各有什麼差別(一般是筆試題的選擇題裡面出的多一點)

Bit是最小的傳輸機關,byte是最小的存儲機關,1byte=8bit,char 是一種基本資料類型,1char=2byte.

5.BufferedReader屬于哪種流,它主要是用來做什麼的,它裡面有那些經典的方法

解題思路:望文知意,Reader是字元流,而buffer是緩沖的作用,緩沖區是基于記憶體的,起到讀寫高效的作用;是以BufferedReader是高效字元流

BufferedReader是字元流,也是一種包裝流,用來增強reader流.主要用來讀取資料的,最經典的方法是readline,可以一次讀一行,是reader不具備的.

6.什麼是節點流,什麼是處理流,它們各有什麼用處,處理流的建立有什麼特征

節點流: 直接與資料源相連,用于輸入或者輸出

處理流:在節點流的基礎上對之進行加工,進行一些功能的擴充

處理流的構造器必須要傳入節點流的子類

7.如果我要對位元組流進行大量的從硬碟讀取,要用那個流,為什麼?

解題思路:因為明确說了是對位元組流的讀取,是以肯定是inputstream或者他的子類,又因為要大量讀取,肯定要考慮到高效的問題,自然想到緩沖流。

用BufferedInputStream,原因:BufferedInputStream是InputStream的緩沖流,使用它可以防止每次讀取資料時進行實際的寫操作,代表着使用緩沖區。不帶緩沖的操作,每讀一個位元組就要寫入一個位元組,由于涉及磁盤的IO操作相比記憶體的操作要慢很多,是以不帶緩沖的流效率很低。帶緩沖的流,可以一次讀很多位元組,但不向磁盤中寫入,隻是先放到記憶體裡。等湊夠了緩沖區大小的時候一次性寫入磁盤,這種方式可以減少磁盤操作次數,速度就會提高很多!并且也可以減少對磁盤的損傷。

8.如果我要列印出不同類型的資料到資料源,那麼最适合的流是那個流,為什麼?

解題思路:要考慮到列印的問題,就要用到列印輸出流(printstream:操作位元組流;或者是PrintWriter操作字元流)

用printstream,因為隻有位元組流才能讀寫各種類型的資料.

9.怎麼樣把輸出位元組流轉換成輸出字元流,說出它的步驟?

解題思路:把位元組流轉成字元流,這裡肯定就要用到擴充卡模式,很自然的要想到outputstreamwriter。它繼承了Writer接口,但要建立它必須在構造函數中傳入一個outputstream的執行個體,outputstreamwriter的作用也就是将outputstream适配到Writer。,它實作了Reader接口,并且持有了InputStream的引用。(關于擴充卡的作用,可以想一下電腦轉接頭的例子)

利用轉換流outputstreamwriter.建立一個位元組流對象,将其作為參數傳入轉換流outputstreamwriter中,得到字元流對象.

10.什麼叫對象序列化,什麼是反序列化,實作對象序列化需要做哪些工作?

對象序列化:将對象以二進制的形式儲存到硬碟上;

反序列化:将二進制檔案轉化為對象讀取.

将需要序化的類實作Serializable接口

11.說說你對io流的了解

解題思路:個人覺得,可以講io流的作用和體系

io流就相當于讀寫資料的一個管道.主要分為輸入流和輸出流,分别對應讀資料和寫資料.

12.談一談io流中用到的擴充卡模式和裝飾者模式

解題思路:首先,要知道裝飾者模式和擴充卡模式的作用;其次,可以自己舉個例子把它的作用生動形象地講出來;最後,簡要說一下要完成這樣的功能需要什麼樣的條件。

裝飾器模式:就是動态地給一個對象添加一些額外的職責(對于原有功能的擴充)。

1.它必須持有一個被裝飾的對象(作為成員變量)。

2.它必須擁有與被裝飾對象相同的接口(多态調用、擴充需要)。

3.它可以給被裝飾對象添加額外的功能。

比如,在io流中,FilterInputStream類就是裝飾角色,它實作了InputStream類的所有接口,并持有InputStream的對象執行個體的引用,BufferedInputStream是具體的裝飾器實作者,這個裝飾器類的作用就是使得InputStream讀取的資料儲存在記憶體中,而提高讀取的性能。

擴充卡模式:将一個類的接口轉換成客戶期望的另一個接口,讓原本不相容的接口可以合作無間。

1.擴充卡對象實作原有接口

2.擴充卡對象組合一個實作新接口的對象

3.對擴充卡原有接口方法的調用被委托給新接口的執行個體的特定方法(重寫舊接口方法來調用新接口功能。)

比如,在io流中, InputStreamReader類繼承了Reader接口,但要建立它必須在構造函數中傳入一個InputStream的執行個體,InputStreamReader的作用也就是将InputStream适配到Reader。 InputStreamReader實作了Reader接口,并且持有了InputStream的引用。這裡,擴充卡就是InputStreamReader類,而源角色就是InputStream代表的執行個體對象,目标接口就是Reader類。

擴充卡模式主要在于将一個接口轉變成另一個接口,它的目的是通過改變接口來達到重複使用的目的;而裝飾器模式不是要改變被裝飾對象的接口,而是保持原有的接口,但是增強原有對象的功能,或改變原有對象的方法而提高性能。