日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

IO-5(InputStreamReader、OutputStreamWriter、序列化流、反序列化流、Serializable、transient)

發布時間:2024/10/14 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 將一個對象存儲到持久化設備上的步驟

  • 明確存儲對象的文件
  • 給操作文件對象加入寫入對象的功能
  • 調用寫入對象的方法
  • 關閉資源
import java.io.Serializable;public class Person implements Serializable{/*** */private static final long serialVersionUID = 1L;String name;int age;public Person(String name,int age) {this.name=name;this.age=age;}public String toString() {return "name:"+this.name+",age:"+this.age;} } import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream;public class Test{public static void main(String[] args) throws IOException {FileOutputStream fos=new FileOutputStream("a.txt");ObjectOutputStream oos=new ObjectOutputStream(fos);oos.writeObject(new Person("zhangsan",30));oos.close();fos.close();} }

運行結果:

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 常見問題

  • 先寫對象
  • 再讀對象
  • 接著改該Person類
  • 再讀對象,出現InvalidClassException
  • 原因:

    • 該類的序列版本號與從流中讀取的類描述符的版本號不匹配。
    • 該類包含位置數據類型
    • 該類沒有可訪問的無參構造方法

    解決辦法:給一個默認的序列化ID

    6.transient

    瞬態關鍵字

    當一個類的獨享需要被序列化時,某些屬性不需要序列化,可用關鍵字transient修飾。

    靜態修飾的屬性也不會被序列化。

    • 因為序列化是把對象數據持久化存儲,靜態屬于類加載時的數據,不會被序列化。

    private static String name;

    private transient int age;

    總結

    以上是生活随笔為你收集整理的IO-5(InputStreamReader、OutputStreamWriter、序列化流、反序列化流、Serializable、transient)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。