Java-IO流-字節流(串流)

  • #字節流的操作(InputStream、OutputStream)

@繼承架構

InputStream  //System.in是其一個實例
    FileInputStream  //操作文檔
    ByteArrayInputStream  //操作byte數組
    FilterInputStream
        BufferedInputStream
        DataInputStream
    ObjectInputStream

OutputStream
    FileOutputStream
    ByteArrayOutputStream
    FilterOutputStream
        BufferedOutputStream
        DataOutputStream
        PrintStream  //System.out是其一個實例
    ObjectOutputStream

@InputStream與OutputStream的基本用法

1.InputStream是一個操作了Closeable接口的抽象類,有一個名叫read()的抽象調用。

2.OutputStream操作了Closeable、Flushable接口的抽象類,有一個名叫write()的抽象調用。

3.這兩者在使用完畢後都必須要調用各自的close()方法關閉串流。(Closeable接口extends接口AutoCloseable,所以可以使用JDK7以後的自動關閉資源語法)
---> Demo舉例

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

class ActionOfIO{
	public static void copy(InputStream input, OutputStream output) throws IOException{
		byte data[] = new byte[2048];
		int len;
		try(InputStream src = input; OutputStream dest = output){//自動關閉語法
			while((len = src.read(data)) != -1){
				dest.write(data, 0, len);
			}
		}
	}
}

@InputStream、OutputStream常用的子類

1.FileInputStream與FileOutputStream,提供對文件的讀取和寫入操作。

2.ByteArrayInputStream與ByteArrayOutputStream,提供對byte數組的讀取和寫入操作。

@標準輸入輸出(java.lang.System.in、java.lang.System.out、java.lang.System.err)

1.使用System.setIn()調用,設置InputStream實例,重新指定標準輸入源。

2.使用System.setOut()調用,設置PrintStream實例,重新指定標準輸出源。

3.使用System.setErr()調用,設置PrintStream實例,重新指定標準錯誤輸出源。

@字節流的打包器(裝飾器)

1.BufferedInputStream與BufferedOutputStream,提供緩存作用的打包器(裝飾器)

其內部默認實現有一定大小的緩衝區,當緩衝區滿了後再將裏面的數據進行轉移,以此來減少對輸出流的寫入次數,提高效率。

(ps:個人覺得,雖然減少了對輸出流的寫入次數,但增加了對內存的消耗)

---> Demo舉例

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

class ActionOfIO{
	public static void copy(InputStream input, OutputStream output) throws IOException{
		byte data[] = new byte[2048];
		int len;
		try(InputStream src = new BufferedInputStream(input); OutputStream dest = new BufferedOutputStream(output) ){//自動關閉語法
			while((len = src.read(data)) != -1){
				dest.write(data, 0, len);
			}
		}
	}
}

2.DataInputStream與DataOutputStream,提供數據轉換處理的裝飾器

其提供讀取、寫入Java基本數據類型的方法,這些方法會自動在指定類型與字節間轉換。

---> Demo舉例

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

class FileDataOperation{
	public static String load(InputStream src) throws IOException{
		StringBuilder tempStr = new StringBuilder();
		try(DataInputStream input = new DataInputStream(src) ){
			tempStr.append(input.readUTF());
			tempStr.append(" ");
			tempStr.append(input.readUTF());
			tempStr.append(" ");
			tempStr.append(input.readInt());
		}
		return tempStr.toString();
	}
	public static void save(OutputStream src) throws IOException{
		try(DataOutputStream output = new DataOutputStream(src) ){
			output.writeUTF("Jack");
			output.writeUTF("Age");
			output.writeInt(18);
		}
	}
}

3.ObjectInputStream與ObjectOutputStream,提供對象串行化(序列化)功能的裝飾器

其可以將操作了Serializable接口的對象進行串行化讀取、寫入。

---> Demo舉例

import static java.lang.System.out;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

class SerializableObjectOperation implements Serializable{
	private String name;
	private double price;
	private int stock;
	public SerializableObjectOperation(String tn, double tp, int ts){
		this.name = tn; this.price = tp; this.stock = ts;
	}
	public String toString(){
		return "name:"+this.name+", price:"+this.price+", stock:"+this.stock;
	}
	
	public static SerializableObjectOperation load(InputStream src) throws IOException, ClassNotFoundException{
		SerializableObjectOperation object;
		try(ObjectInputStream input = new ObjectInputStream(src) ){
			object = (SerializableObjectOperation) input.readObject();//調用readObject()方法讀取對象
		}
		return object;
	}	
	public static void save(OutputStream src, SerializableObjectOperation object) throws IOException, ClassNotFoundException{
		try(ObjectOutputStream output = new ObjectOutputStream(src) ){
			output.writeObject(object); //調用writeObject()方法寫入對象的串行化數據
		}
	}
}

public class Temp{
	static int ta;
	public static void main(String... args) throws IOException, ClassNotFoundException{  
		SerializableObjectOperation.save(new FileOutputStream(args[0]), new SerializableObjectOperation("tom", 189.9, 33) );
		out.println( SerializableObjectOperation.load(new FileInputStream(args[0])).toString() );
		
   }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章