教面試官ReentrantLock源碼
862
2025-04-01
1. Java 中有幾種類型的流
按照流的方向:輸入流(inputStream) 和輸出流(outputStream)
按照實現功能分:節點流(可以從或向一個特定的地方(節點)
讀寫數據。如FileReader)和處理流(是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫,如BufferedReader處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱為流的鏈接。)
按照處理數據的單位:字節流和字符流。字節流繼承于InputStream 和OutputStream,字符流繼承于InputStreamReader和OutputStreamWriter。
2.字節流如何轉為字符流
字節輸入流轉字符輸入流通過InputStreamReader實現,該類的構造函數可以傳入InputStream對象。
字節輸出流轉字符輸出流通過OutputStreamWriter實現,該類的構造函數可以傳入OutputStream對象。
3.如何將一 個java對象序列化到文件里
在java中能夠被序列化的類必須先實現Serializable接口,該接口沒有任何抽象方法只是起到一個標記作用。
//對象輸出流 ObjectOutputStream objectOutputStream = new ObjectOutputStream (new FileOutputStream(new File ("D://obj"))); objectOutputStream.writeObject (new User (" zhangsan", 100) ); objectOutputStream.close(); //對象輸入流 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File ("D://obj"))); User user = (User) objectInputstream.readObject(); System.out.println(user); objectInputStream.close();
1
2
3
4
5
6
7
8
9
10
11
12
4.字節流和字符流的區別
字節流讀取的時候,讀到一個字節就返回一個字節;字符流使用了字節流讀到一個或多個字節(中文對應的字節數是兩個,在UTF-8碼表中是3個字節)時。先去查指定的編碼表,將查到的字符返回。字節流可以處理所有類型數據,如:圖片, MP3 ,AVI視頻文件,而字符流只能處理字符數據。只要是處理純文本數據,就要優先考慮使用字符流,除此之外都用字節流。字節流主要是操作byte類型數據,以byte數組為準,要操作類就是OutputStream. InputStream
字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節流好點,如果是關系到中文(文本)的,用字符流好點。在程序中一個字符等于兩個字節,java提供了Reader. Writer 兩個專門操作字符流的類。
5.什么是 java序列化,如何實現java序列化?
簡要解釋:
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。
序列化是為了解決在對對象流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
詳細解釋:
當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換為字節序列,才能在網絡上傳送;接收方則需要把字節序列再恢復為Java對象。
只能將支持 java.io.Serializable 接口的對象寫入流中。每個 serializable 對象的類都被編碼,編碼內容包括類名和類簽名、對象的字段值和數組值,以及從初始對象中引用的其他所有對象的閉包。
概念
序列化:把Java對象轉換為字節序列的過程。
反序列化:把字節序列恢復為Java對象的過程。
用途
對象的序列化主要有兩種用途:
1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
2) 在網絡上傳送對象的字節序列。
序列化API
java.io.ObjectOutputStream代表對象輸出流,它的
writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。只有實現了Serializable和Externalizable接口的類的對象才能被序列化。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,并將其返回。
代碼示例
import java.io.*; import java.util.Date; public class ObjectSaver { public static void main(String[] args) throws Exception { /*其中的 D:\\objectFile.obj 表示存放序列化對象的文件*/ //序列化對象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj")); Customer customer = new Customer("王麻子", 24); out.writeObject("你好!"); //寫入字面值常量 out.writeObject(new Date()); //寫入匿名Date對象 out.writeObject(customer); //寫入customer對象 out.close(); //反序列化對象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj")); System.out.println("obj1 " + (String) in.readObject()); //讀取字面值常量 System.out.println("obj2 " + (Date) in.readObject()); //讀取匿名Date對象 Customer obj3 = (Customer) in.readObject(); //讀取customer對象 System.out.println("obj3 " + obj3); in.close(); } } class Customer implements Serializable { private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } public String toString() { return "name=" + name + ", age=" + age; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
執行結果
說明:
讀取對象的順序與寫入時的順序要一致。
對象的默認序列化機制寫入的內容是:對象的類,類簽名,以及非瞬態和非靜態字段的值。
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。