1. Java 中有幾種類型的流
- 按照流的方向:輸入流(inputStream) 和輸出流(outputStream)
- 按照實現(xiàn)功能分:節(jié)點流(可以從或向一個特定的地方(節(jié)點)
讀寫數(shù)據(jù)。如FileReader)和處理流(是對一個已存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實現(xiàn)數(shù)據(jù)讀寫,如BufferedReader處理流的構(gòu)造方法總是要帶一個其他的流對象做參數(shù),。一個流對象經(jīng)過其他流的多次包裝,稱為流的鏈接,。) - 按照處理數(shù)據(jù)的單位:字節(jié)流和字符流,。字節(jié)流繼承于InputStream 和OutputStream,字符流繼承于InputStreamReader和OutputStreamWriter,。
2.字節(jié)流如何轉(zhuǎn)為字符流
-
字節(jié)輸入流轉(zhuǎn)字符輸入流通過InputStreamReader實現(xiàn),該類的構(gòu)造函數(shù)可以傳入InputStream對象,。
-
字節(jié)輸出流轉(zhuǎn)字符輸出流通過OutputStreamWriter實現(xiàn),該類的構(gòu)造函數(shù)可以傳入OutputStream對象。
3.如何將一 個java對象序列化到文件里
在java中能夠被序列化的類必須先實現(xiàn)Serializable接口,該接口沒有任何抽象方法只是起到一個標(biāo)記作用,。
//對象輸出流
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();
4.字節(jié)流和字符流的區(qū)別
- 字節(jié)流讀取的時候,讀到一個字節(jié)就返回一個字節(jié);字符流使用了字節(jié)流讀到一個或多個字節(jié)(中文對應(yīng)的字節(jié)數(shù)是兩個,在UTF-8碼表中是3個字節(jié))時,。先去查指定的編碼表,將查到的字符返回,。字節(jié)流可以處理所有類型數(shù)據(jù),如:圖片, MP3 ,AVI視頻文件,而字符流只能處理字符數(shù)據(jù),。只要是處理純文本數(shù)據(jù),就要優(yōu)先考慮使用字符流,除此之外都用字節(jié)流。字節(jié)流主要是操作byte類型數(shù)據(jù),以byte數(shù)組為準(zhǔn),要操作類就是OutputStream. InputStream
- 字符流處理的單元為2個字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個字節(jié),操作字節(jié)和字節(jié)數(shù)組,。所以字符流是由Java虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個字節(jié)的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片,、歌曲,就用字節(jié)流好點,如果是關(guān)系到中文(文本)的,用字符流好點。在程序中一個字符等于兩個字節(jié),java提供了Reader. Writer 兩個專門操作字符流的類,。
5.什么是 java序列化,如何實現(xiàn)java序列化?
簡要解釋:
序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化??梢詫α骰蟮膶ο筮M(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。
序列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題,。序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流,。
詳細(xì)解釋:
當(dāng)兩個進(jìn)程在進(jìn)行遠(yuǎn)程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送,。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對象。
只能將支持 java.io.Serializable 接口的對象寫入流中,。每個 serializable 對象的類都被編碼,編碼內(nèi)容包括類名和類簽名、對象的字段值和數(shù)組值,以及從初始對象中引用的其他所有對象的閉包,。
序列化:把Java對象轉(zhuǎn)換為字節(jié)序列的過程。
反序列化:把字節(jié)序列恢復(fù)為Java對象的過程,。
對象的序列化主要有兩種用途:
1) 把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中;
2) 在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。
java.io.ObjectOutputStream代表對象輸出流,它的
writeObject(Object obj)方法可對參數(shù)指定的obj對象進(jìn)行序列化,把得到的字節(jié)序列寫到一個目標(biāo)輸出流中,。只有實現(xiàn)了Serializable和Externalizable接口的類的對象才能被序列化。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節(jié)序列,再把它們反序列化為一個對象,并將其返回,。
代碼示例
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;
}
}
執(zhí)行結(jié)果
- 說明:
讀取對象的順序與寫入時的順序要一致。
對象的默認(rèn)序列化機(jī)制寫入的內(nèi)容是:對象的類,類簽名,以及非瞬態(tài)和非靜態(tài)字段的值,。