- #字節流的操作(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() );
}
}