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(); } }
該類實現了將數據寫入字節數組的輸出流。 當數據寫入緩衝區時,緩衝區會自動增加。 數據可使用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
- 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(); } }