io流中比較特殊的流-java

1.序列流(SequenceInputStream)整合個多個文件

A SequenceInputStream表示其餘輸入流的邏輯級聯。 它從一個有序的輸入流集合開始,從第一個讀取到文件的結尾,而後從第二個文件讀取,依此類推,直到最後一個輸入流達到文件的結尾。java

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;

public class Test8 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis1 = new FileInputStream("a.txt");
        FileInputStream fis2 = new FileInputStream("b.txt");
        FileInputStream fis3 = new FileInputStream("c.txt");
        Vector<FileInputStream> v = new Vector<>();
        v.add(fis1);
        v.add(fis2);
        v.add(fis3);
        Enumeration<FileInputStream> en = v.elements();    // 獲取枚舉引用
        SequenceInputStream sis = new SequenceInputStream(en);
        FileOutputStream fos = new FileOutputStream("sum.txt");
        int b;
        while ((b = sis.read()) != -1){
            fos.write(b);
        }
        sis.close();
        fos.close();
    }
}

 

2.內存輸出流(ByteArrayOutputStream)

該類實現了將數據寫入字節數組的輸出流。 當數據寫入緩衝區時,緩衝區會自動增加。 數據可使用toByteArray()和toString() 。數組

通常,讀一個文本文件輸出到控制檯會用字符流而不用字節流。爲何呢?字節流能夠讀一個字節,或者一個字節數組。首先讀一個字節確定是不可行的,程序讀到一個字節,怎麼轉回一個字符?而後是字節數組,不一樣的編碼格式佔字節數是不一樣的,UTF-8編碼下一個中文所佔字節也是不肯定的,多是2個、3個、4個字節;因此,字節數組的長度也不知道是多少。網絡

若是必定要用字節流來讀一個文本文件,輸出到控制檯,那麼就要用ByteArrayOutputStream了。ide

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class Test9 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        byte[] arr = new byte[4];
        int len;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while ((len = fis.read(arr)) != -1){
            baos.write(arr,0,len);
        }
        System.out.println(baos.toString());     // toString()方法能夠省略
    }
}

類似的還有ByteArrayInputStream。this

 

3.對象操做流(ObjectOutputStream與ObjectInputStream)

  • ObjectOutputStream

將Java對象的原始數據類型和圖形寫入OutputStream。 可使用ObjectInputStream讀取(重構)對象。 能夠經過使用流的文件來實現對象的持久存儲。 若是流是網絡套接字流,則能夠在另外一個主機上或另外一個進程中重構對象。只有支持java.io.Serializable接口的對象才能寫入流中。 每一個可序列化對象的類被編碼,包括類的類名和簽名,對象的字段和數組的值以及從初始對象引用的任何其餘對象的關閉。方法writeObject用於將一個對象寫入流中。 任何對象,包括字符串和數組,都是用writeObject編寫的。 多個對象或原語能夠寫入流。 必須從對應的ObjectInputstream讀取對象,其類型和寫入次序相同。編碼

 

  • ObjectInputStream

反序列化先前使用ObjectOutputStream編寫的原始數據和對象。ObjectOutputStream和ObjectInputStream能夠分別爲與FileOutputStream和FileInputStream一塊兒使用的對象圖提供持久性存儲的應用程序。 ObjectInputStream用於恢復先前序列化的對象。 其餘用途包括使用套接字流在主機之間傳遞對象,或者在遠程通訊系統中進行封送和解組參數和參數。spa

示例:ObjectOutputStreamcode

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Test10 {
    public static void main(String[] args) throws IOException {
        Person p1 = new Person("張三",13);
        Person p2 = new Person("李四",14);
        ArrayList<Person> list = new ArrayList<>();   // 直接存儲p1,p2對象也能夠,可是讀取的時候,不知道個數,讀超了會出現EOFException。因此最好的辦法是放在一個集合裏,讀一次便可
        list.add(p1);
        list.add(p2);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d.txt"));
        oos.writeObject(list);
        oos.close();
    }
}

class Person implements Serializable {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

示例:ObjectInputStream對象

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

public class Test11 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d.txt"));
        ArrayList<Person> list = (ArrayList<Person>) ois.readObject();
        for (Person p: list) {
            System.out.println(p);
        }
        ois.close();
    }
}
相關文章
相關標籤/搜索