一、ByteArrayOutputStream
ByteArrayOutputStream(int size) 創建一個新的 byte 數組輸出流,它具有指定大小的緩衝區容量(以字節爲單位)。
此類實現了一個輸出流,緩衝區會隨着數據的不斷寫入而自動增長。可使用 toByteArray()和 toString()獲取數據。
關閉 ByteArrayOutputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何IOException。
ByteArrayOutputStream常用於存儲數據以用於一次寫入
二、ByteArrayInputStream
ByteArrayInputStream(byte[] buf) 創建一個 ByteArrayInputStream,使用 buf 作爲其緩衝區數組。
作用:把字節串/字節數組轉換成一種輸入流的形式,這樣就可以被高級輸入工具DataInputStream直接處理,比如處理成各種類型,double,float,char,int, short,long,或任何對象,或字符串,或媒體數據。把一塊內存作爲輸入的一種方式。用處很多。
個人認爲一個比較好的用途是在網絡中讀取數據包,由於數據包一般是定長的,我們可以先分配一個夠大的byte數組,比如byte buf[]=new byte[1024];
然後調用某個方法得到網絡中的數據包,例如:
Socket s=...;
DataInputStream dis=new DataInputStream(s.getInputStream());
dis.read(buf);//把所有數據存到buf中
ByteArrayInputStream bais=new ByteArrayInputStream(buf); //把剛纔的部分視爲輸入流
DataInputStream dis_2=new DataInputStream(bais);
//現在可以使用dis_2的各種read方法,讀取指定的字節
上面的示例的兩次包裝看上去有點多此一舉,但使用ByteArrayInputStream的好處是關掉流之後它的數據仍然存在。
import java.io.*;
public class ByteStreamTest {
public static void main(String[] args)throws Exception {
ByteArrayOutputStream bOutput = new ByteArrayOutputStream(8);
byte[] b = "abcde".getBytes();
bOutput.write(b);
for(int x=0; x<b.length; x++){
System.out.print((char)b[x] +" ");
}
System.out.println(" ");
ByteArrayInputStream bInput = new ByteArrayInputStream(b);
System.out.println("轉換成大寫字母后");
int c;
for(int y=0; y<1; y++){
// 注意:這裏我們一個一個字節的讀
while((c=bInput.read())!=-1){
System.out.print(Character.toUpperCase((char)c)+" ");
}
bInput.reset();
}
}
}
a b c d e
轉換成大寫字母后
A B C D E