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類。
適配器模式主要在於將一個接口轉變成另一個接口,它的目的是通過改變接口來達到重復使用的目的;而裝飾器模式不是要改變被裝飾對象的接口,而是保持原有的接口,但是增強原有對象的功能,或改變原有對象的方法而提高性能。
原文:https://blog.csdn.net/weixin_41768263/article/details/80453196