IO-5(InputStreamReader、OutputStreamWriter、序列化流、反序列化流、Serializable、transient)
1.InputStreamReader
字節流通向字符的橋梁
所有已實現的接口:
Closeable, Readable
直接已知子類:
FileReader
將字節輸入流轉換為字符輸入流
使用指定的字符編碼表(可顯式指定也可接受默認),讀取字節并將其解碼為字符
1.1構造函數
InputStreamReader(InputStream in):創建一個使用默認字符集的InputStreamReader
InputStreamReader(InputStream in,Charset chas):創建一個使用指定字符集的InputStreamReader
1.2 方法
int read():讀取單個字符
int read(char[] chs,int index,int len):?將字符讀入數組中的某一部分
1.3 使用步驟
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;public class Test{public static void main(String[] args) throws IOException {//關聯文件和字節輸入流對象InputStream in=new FileInputStream("a.txt");//轉換流對象,字節--->字符InputStreamReader isr=new InputStreamReader(in,"GBK");//utf-8時是問號,不寫也可正常輸出int ch=0;while((ch=isr.read())!=-1)System.out.print((char)ch);isr.close();in.close();} }運行結果:
2.OutputStreamWriter
字符流通向字節流的橋梁。
所有已實現的接口:
Closeable, Flushable, Appendable
直接已知子類:
FileWriter
作用就是利用字節流作為底層輸出流然后構建字符輸出流,字符輸出流輸出字符到流中,然后通過指定的字符集把流中的字符編碼成字節輸出到字節流中,其作用就是一個橋梁,使得雙方鏈接起來。
2.1構造函數
OutputStreamWriter(OutputStream out):創建使用默認字符編碼的 OutputStreamWriter。
OutputStreamWriter(OutputStream out,Charset cs):創建使用給定字符集的 OutputStreamWriter。
2.2 方法
void write(int c):寫入單個字符
void write(char[] chs,int index,int len):寫入字符數組的某一部分
2.3使用步驟
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter;public class Test{public static void main(String[] args) throws IOException {OutputStream out=new FileOutputStream("a.txt");OutputStreamWriter osw=new OutputStreamWriter(out,"GBK");osw.write("我在呢!");osw.close();out.close();} }運行結果:
2.4總結
父類:OutputStreanWriter、InputStreamReader,字符和字節之間的橋梁,源流:字節流+編碼表
子類:FileWriter、FileReader,操作文件的便捷類,使用默認的編碼表時,可不用父類。
字節->字符,讀,輸入流,InputStreamReader
字符->字節,寫,輸出流,OutputStreamWriter
3.ObjectOutputStream
序列化流
所有已實現的接口:
Closeable, DataOutput, Flushable, ObjectOutput, ObjectStreamConstants
用于向文件中寫入對象,將 Java 對象的基本數據類型和圖形寫入 OutputStream。可
可以使用 ObjectInputStream 讀取(重構)對象。
只能將支持 java.io.Serializable 接口的對象寫入流中,若未實現,會出現NotSerializableException。
3.1構造方法
ObjectOutpputStream(OutputStream out):創建寫入指定 OutputStream 的 ObjectOutputStream
3.2 方法
void writeObject(Object obj):將指定的對象寫入 ObjectOutputStream
void writeInt(int i):寫入int值
3.3 將一個對象存儲到持久化設備上的步驟
- 明確存儲對象的文件
- 給操作文件對象加入寫入對象的功能
- 調用寫入對象的方法
- 關閉資源
運行結果:
4.ObjectInputStream
反序列化流,對以前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化。
所有已實現的接口:
Closeable, DataInput, ObjectInput, ObjectStreamConstants
用于從流中讀取對象
ObjectOutputStream 和 ObjectInputStream 分別與 FileOutputStream 和 FileInputStream 一起使用時,可以為應用程序提供對對象圖形的持久存儲。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的對象才能從流讀取。
4.1構造函數
ObjectInputStream(FileInputStream in):創建從指定 InputStream 讀取的 ObjectInputStream。
4.2方法
Object readObject():從 ObjectInputStream 讀取對象。
int readInt():?讀取一個 32 位的 int 值。
4.3 對象的反序列化步驟
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream;public class Test{public static void main(String[] args) throws IOException, ClassNotFoundException {FileInputStream fis=new FileInputStream("a.txt");ObjectInputStream ois=new ObjectInputStream(fis);Person p=(Person)ois.readObject();System.out.println(p.toString());ois.close();fis.close();} }運行結果:
5.Serializable接口
java.io.Serializable
類通過實現 java.io.Serializable 接口以啟用其序列化功能。
未實現此接口的類將無法使其任何狀態序列化或反序列化。
可序列化類的所有子類型本身都是可序列化的。
序列化接口沒有方法或字段,僅用于標識可序列化的語義。
5.1 常見問題
原因:
- 該類的序列版本號與從流中讀取的類描述符的版本號不匹配。
- 該類包含位置數據類型
- 該類沒有可訪問的無參構造方法
解決辦法:給一個默認的序列化ID
6.transient
瞬態關鍵字
當一個類的獨享需要被序列化時,某些屬性不需要序列化,可用關鍵字transient修飾。
靜態修飾的屬性也不會被序列化。
- 因為序列化是把對象數據持久化存儲,靜態屬于類加載時的數據,不會被序列化。
private static String name;
private transient int age;
總結
以上是生活随笔為你收集整理的IO-5(InputStreamReader、OutputStreamWriter、序列化流、反序列化流、Serializable、transient)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO-4(BufferedInputSt
- 下一篇: IO-6(PrintStream/Pri