1. 程式人生 > >javaSE (三十三)其他流(序列流、記憶體輸出流、隨機訪問流、物件操作流、資料輸入輸出流、列印流、標準輸入輸出流、properties)

javaSE (三十三)其他流(序列流、記憶體輸出流、隨機訪問流、物件操作流、資料輸入輸出流、列印流、標準輸入輸出流、properties)

1、序列流(SequenceInputStream ):

序列流主要的作用就是整合位元組輸入流,將很多的進口整合成一個
這裡著重講一下多於兩個輸入流的整合:

步驟:

  1. 建立三個輸入流
  2. 建立vector集合存入這些輸入流
  3. 將這些輸入流變成列舉型別 Vector.elements();
  4. 建立序列流(第二種構造方法)
  5. 輸出流
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