io流中的幾個面試題


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

字符流和字節流。字節流繼承inputStream和OutputStream,字符流繼承自InputSteamReader和OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。

2.字符流和字節流有什么區別?

要把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStreamInputStream ,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。

在應用中,經常要完全是字符的一段文本輸出去或讀進來,用字節流可以嗎?計算機中的一切最終都是二進制的字節形式存在。對於“中國”這些字符,首先要得到其對應的字節,然后將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,人家專門提供了字符流的包裝類。

  底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設別寫入或讀取字符串提供了一點點方便。

  字符向字節轉換時,要注意編碼的問題,因為字符串轉成字節數組,

  其實是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。

講解字節流與字符流關系的代碼案例:

1 import java.io.BufferedReader;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.FileReader;
 5 import java.io.FileWriter;
 6 import java.io.InputStreamReader;
 7 import java.io.PrintWriter;
 8 
 9 public class IOTest {
10     public static void main(String[] args) throws Exception {
11         String str = "中國人";
12         /*FileOutputStream fos  = new     FileOutputStream("1.txt");
13         
14         fos.write(str.getBytes("UTF-8"));
15         fos.close();*/
16         
17         /*FileWriter fw = new FileWriter("1.txt");
18         fw.write(str);
19         fw.close();*/
20         PrintWriter pw = new PrintWriter("1.txt","utf-8");
21         pw.write(str);
22         pw.close();
23         
24         /*FileReader fr = new FileReader("1.txt");
25         char[] buf = new char[1024];
26         int len = fr.read(buf);
27         String myStr = new String(buf,0,len);
28         System.out.println(myStr);*/
29         /*FileInputStream fr = new FileInputStream("1.txt");
30         byte[] buf = new byte[1024];
31         int len = fr.read(buf);
32         String myStr = new String(buf,0,len,"UTF-8");
33         System.out.println(myStr);*/
34         BufferedReader br = new BufferedReader(
35                 new InputStreamReader(
36                     new FileInputStream("1.txt"),"UTF-8"    
37                     )
38                 );
39         String myStr = br.readLine();
40         br.close();
41         System.out.println(myStr);
42     }
43 

 

3.什么是java序列化,如何實現java序列化?

我們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其他計算機,這個過程我們可以自己寫代碼去把一個java對象變成某個格式的字節流再傳輸,但是,jre本身就提供了這種支持,我們可以調用OutputStream的writeObject方法來做,如果要讓java 幫我們做,要被傳輸的對象必須實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的。 

例如,在web開發中,如果對象被保存在了Session中,tomcat在重啟時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。如果對象要經過分布式系統進行網絡傳輸或通過rmi等遠程調用,這就需要在網絡上傳輸對象,被傳輸的對象就必須實現Serializable接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM