1. 程式人生 > 實用技巧 >24_IO流之緩衝流與序列化流

24_IO流之緩衝流與序列化流

1. 位元組緩衝流

BufferedOutputStream

BufferedInputStream

package e_bufferStream;

import java.io.*;

/**
 * 位元組緩衝流
 */
public class BufferStream01 {
    public static void main(String[] args) throws IOException {
        //位元組緩衝輸出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("9_io\\dest.txt"));

        //寫資料
        //bos.write("hello\r\n".getBytes());
        //bos.write("world\r\n".getBytes());

        //釋放資源
        bos.close();

        //位元組緩衝輸入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("9_io\\src.txt"));
        //一次讀一個位元組
        //int by;
        //while((by=bis.read()) != -1){
        //    System.out.print((char)by);
        //}

        //一次讀一個位元組陣列
        byte[] bys = new byte[1024];
        int len;
        while((len=bis.read(bys)) != -1){
            System.out.print(new String(bys, 0, len));
        }

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

2. 字元緩衝流

2.1 基本功能

  1. BufferedReader:從字元輸入流讀取文字,緩衝字元,以提供字元,陣列和行的高效讀取。 可以指定緩衝區大小,或者可以使用預設大小。 預設值足夠大,可用於大多數用途。
  2. BufferedWriter:將文字寫入字元輸出流,緩衝字元,以提供單個字元,陣列和字串的高效寫入。可以指定緩衝區大小,或者可以接受預設大小。 預設值足夠大,可用於大多數用途。
package g_bufferedStream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * 字元緩衝流
 */
public class BufferedStream01 {
    public static void main(String[] args) throws IOException {
        //BufferedWriter(Writer out)
        //BufferedWriter fw = new BufferedWriter(new FileWriter("9_io\\dest.txt"));

        //fw.write("hello\r\n");
        //fw.write("world\r\n");
        //fw.write("java");

        //fw.close();

        //BufferedReader(Reader in)
        BufferedReader br = new BufferedReader(new FileReader("9_io\\src.txt"));

        //一次一個字元
        //int ch;
        //while((ch=br.read()) != -1){
        //    System.out.print((char)ch);
        //}

        //一次一個字元陣列
        char[] chs = new char[1024];
        int len;
        while ((len = br.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }

        br.close();
    }
}

2.2 特有功能

  1. BufferedWriter: void newLine();寫一行行分隔符,行分隔符字串由系統屬性定義
  2. BufferedReader: String readLine(); 讀一行文字,到達結尾為null
package g_bufferedStream;

import java.io.*;

/**
 * 字元緩衝流
 */
public class BufferedStream02 {
    public static void main(String[] args) throws IOException {
        //BufferedWriter(Writer out)
        BufferedWriter bw = new BufferedWriter(new FileWriter("9_io\\dest.txt"));

        //寫資料
        /*
        for (int i = 0; i < 10; i++) {
            bw.write("hello" + i);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        */

        //BufferedReader(Reader in)
        BufferedReader br = new BufferedReader(new FileReader("9_io\\src.txt"));

        //讀一行
        //String line = br.readLine();
        //System.out.println(line);

        //讀全部
        String line;
        while((line = br.readLine()) != null){
            System.out.print(line);
        }


        br.close();
    }
}

3. 物件序列化流

物件序列化:就是將物件儲存到磁碟中,或者在網路中傳輸物件.

3.1 ObjectOutputStream

ObjectOutputStream將Java物件的原始資料型別和圖形寫入OutputStream。

可以使用ObjectInputStream讀取(重構)物件。 可以通過使用流的檔案來實現物件的持久儲存。

如果流是網路套接字流,則可以在另一個主機上或另一個程序中重構物件。

只有支援java.io.Serializable介面的物件才能寫入流中。

如果不想被序列化的成員:用transient修飾

package h_objectOutput;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 物件序列化流
 */
public class ObjectOutput01 {
    public static void main(String[] args) throws IOException {
        //ObjectOuptutStream(OutputSteam out):建立一個寫入指定的OutputStream的OutputStream
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("9_io//dest.txt"));

        //建立物件
        Student s  = new Student("tom", 20);

        //寫入物件
        oos.writeObject(s);//被序列化的物件需要實現Serializable介面

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

    }
}

3.2 ObjectInputStream

ObjectInputStream反序列化先前使用ObjectOutputStream編寫的原始資料和物件。

構造方法:ObjectInputStream(InputStream in);

成員方法:Object readObject();

package h_objectOutput;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 反序列化流
 */
public class ObjectInput02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //建立反序列化流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("9_io\\dest.txt"));

        //讀取物件
        Object o = ois.readObject();
        Student s = (Student) o;
        System.out.println(s.getName() + "," + s.getAge());

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