javaSE (三十三)其他流(序列流、記憶體輸出流、隨機訪問流、物件操作流、資料輸入輸出流、列印流、標準輸入輸出流、properties)
1、序列流(SequenceInputStream ):
序列流主要的作用就是整合位元組輸入流,將很多的進口整合成一個
這裡著重講一下多於兩個輸入流的整合:
步驟:
- 建立三個輸入流
- 建立vector集合存入這些輸入流
- 將這些輸入流變成列舉型別 Vector.elements();
- 建立序列流(第二種構造方法)
- 輸出流
package cn.njupt;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class file {
public static void main(String[] args) throws IOException {
//建立三個輸入流
FileInputStream fin1 = new FileInputStream("ooo.txt");
FileInputStream fin2 = new FileInputStream("xxx.txt");
FileInputStream fin3 = new FileInputStream("yyy.txt");
//建立vector集合存入這些輸入流
Vector<FileInputStream> vec = new Vector<>();
vec.add(fin1);
vec.add(fin2);
vec.add(fin3);
//將這些輸入流變成列舉型別
Enumeration<FileInputStream> en = vec.elements();
//建立序列流(第二種構造方法)
SequenceInputStream sis = new SequenceInputStream (en); // 序列流的建立
//輸出流
FileOutputStream fout = new FileOutputStream("rrr.txt");
int b;
while ((b = sis.read()) != -1) {
fout.write(b);
}
sis.close();
fout.close();
}
}
輸出:
我是吳彥祖不信拉倒
2、記憶體輸出流(ByteArrayOutputStream):
就像qq聊天一樣,先在記憶體裡快取一個字元陣列的字元,然後集中輸出,當用位元組流傳輸中文的時候,會產生亂碼(我好像沒有出現,只有不用輸出流而是直接用System.out輸出的時候會亂碼)
測試用例:用記憶體輸出流來傳輸中文位元組
package cn.njupt;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class file {
public static void main(String[] args) throws IOException {
FileInputStream fre = new FileInputStream("rrr.txt");
// FileOutputStream fwr = new FileOutputStream("xxx.txt");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] b = new byte[5];
int len;
while ((len = fre.read(b)) != -1) {
bout.write(b, 0, len);
// System.out.println(new String(b,0,len));
}
System.out.println(bout); // 即使沒有呼叫tostring方法,系統自動呼叫
fre.close();
}
}
輸出:
我是吳彥祖(無亂碼)
3、隨機訪問流(RandomAccessFile):
繼承Object的物件,挺簡單的,直接看api吧
4、物件操作流(ObjectOutputStream/ObjectInputStream):
將物件序列化儲存到檔案裡,直接看api
被序列化的物件應該實現序列化介面
下面來用集合裝幾個物件,然後把集合物件存到檔案裡,然後再讀取
程式碼:
package cn.njupt;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
//ObjectOutputStream/ObjectInputStream
public class file {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Student s1 = new Student("吳彥祖", 23);
Student s2 = new Student("范冰冰", 24);
Student s3 = new Student("林俊杰", 25);
Student s4 = new Student("周杰倫", 26);
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
// list是集合物件,下面將這個物件儲存到檔案上
/*
* Object readObject() 從ObjectInputStream讀取一個物件。
*/
ObjectOutputStream ops = new ObjectOutputStream(new FileOutputStream("out.txt"));
ops.writeObject(list);
ops.close();
ObjectInputStream oin = new ObjectInputStream(new FileInputStream("out.txt"));
ArrayList<Student> list2 = (ArrayList<Student>) oin.readObject();
System.out.println(list2);
oin.close();
}
}
5、資料輸入輸出流(DataInputStream/DataOutputStream):
可以輸入輸出原始Java資料型別(不會失真),比較簡單,直接看api
6、列印流(PrintStream/PrintWriter):
PrintStream/PrintWriter分別是列印的位元組流和字元流
自動刷出功能只針對println方法
7、標準輸入輸出流(System.in/System.out):
我們平時用的就是標準輸入輸出流,只是直接關聯了鍵盤和顯示屏,他們返回一個位元組輸入輸出流,所以可以將標準輸入輸出流當作位元組輸入輸入流來使用
下面改寫標準輸出輸入流來分別拷貝檔案和圖片:
拷貝檔案:
拷貝圖片:
8、properties:
hashtable的子類,鍵值對儲存資料,也可以當作資料流傳輸,一般用作配置檔案的修改,直接看api