day16

先瞄准再开枪發表於2024-10-19

IO流

IO流【輸入輸出流】:
        按照流向劃分:
            輸入流:外部資料 -> java程式
            輸出流:java程式 -> 外部資料

        按照資料型別劃分【根據使用記事本開啟是否能夠看懂來決定】:
            位元組流【萬能流】:
                位元組輸出流:
                    OutputStream(抽象類)
                        - FileOutputStream(實現子類)【普通的位元組輸出流】
                        構造方法:
                          FileOutputStream(File file)
                          FileOutputStream(String name)

                        - BufferedOnputStream【位元組緩衝輸出流】:
                          構造方法:
                            BufferedOnputStream(FileOutputStream fos)

                位元組輸入流:
                    InputStream(抽象類)
                        FileInputStream【普通的位元組輸入流】:
                          構造方法:
                            FileInputStream(File file)
                            FileInputStream(String name)
                          成員方法:
                            public int read()
                            public int read(byte[] b)

                        BufferedInputStream【位元組緩衝輸入流】:
                        構造方法
                          BufferedInputStream(FileIutputStream fis)
            字元流:
              字元輸入流:
                  Reader【抽象類】
                      - InputStreamReader【具體實現子類】
                          構造方法:
                            IutputStreamWriter(FileIutputStream fos)
                          - FileReader【繼承自InputStreamReader】
                           構造方法:
                              FileReader(String name)等同於IutputStreamReader(new FileIutputStream(String name))
              字元輸出流:
                  Writer【抽象類】
                      - OutputStreamWriter【具體實現子類】
                          構造方法:
                            OutputStreamWriter(FileOutputStream fos)

                          - FileWriter【繼承自OutputStreamWriter】
                           構造方法:
                              FileWriter(String name)等同於OutputStreamWriter(new FileOutputStream(String name))

讀取

// public int read() 一次讀取一個字元
//        System.out.print((char) isr.read());
//        System.out.print((char) isr.read());
//        int i = 0;
//        while ((i = isr.read()) != -1) {
//            System.out.print((char) i);
//        }

        //public int read(char[] cbuf) 一次讀取一個字元陣列
        char[] chars = new char[1024];
        int length = 0;
        while ((length= isr.read(chars))!=-1){
            String s = new String(chars, 0, length);
            System.out.print(s);
        }

序列化及反序列化

序列化:將物件轉化成資料流一樣在網路中傳輸
        物件輸出流:ObjectOutputStream
        只有實現了Serializable介面的類的物件才可以進行序列化

    反序列化:將網路中資料流還原成一個物件
        物件輸入流:ObjectInputStream

   我們正常寫一個物件之後,讀取一個物件都是沒有問題的。
   但是當我們修改了原來的類的時候,再次讀取儲存的物件就報錯了
   java.io.InvalidClassException:
    com.shujia.day16.Teacher;
    local class incompatible:
        stream class desc serialVersionUID = -4530247781226673719,
        local class serialVersionUID = -4180828856871739850

   若不想讓某一個成員序列化的話,只需要在該成員前面加上transient關鍵字
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) throws Exception{
//        write();

        read();
    }
    public static void read() throws Exception{
        //ObjectInputStream(InputStream in)
        //建立從指定的InputStream讀取的ObjectInputStream
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("java/src/com/shujia/day16/obj.txt"));
        Object o = ois.readObject(); //Object o = new Teacher("小虎", 18)
        Teacher t1 = (Teacher)o;
        System.out.println(t1);


        ois.close();
    }

    public static void write() throws Exception{
        Teacher t1 = new Teacher("小虎", 18);
        //建立ObjectOutputStream物件
        //ObjectOutputStream(OutputStream out)
        //建立一個寫入指定的OutputStream的ObjectOutputStream。
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("java/src/com/shujia/day16/obj.txt"));
        oos.writeObject(t1);
        oos.flush();

        //釋放資源
        oos.close();
    }
}