【1】位元組數組流
ByteArrayOutputStream: 可以捕獲記憶體緩沖區的資料,轉換成位元組數組(toByteArray()方法)。
ByteArrayInputStream: 可以将位元組數組轉換為輸入流。
位元組數組輸出流在記憶體中建立一個位元組數組緩沖區,所有發送到輸出流的資料儲存在該位元組數組緩沖區中。
類繼承示意圖如下:
主要屬性和方法如下:
測試示例如下:
@Test
public void byteArray() throws IOException{
ByteArrayOutputStream bout=new ByteArrayOutputStream();
//隻能輸入位元組,不能輸入中文字元
bout.write(1);
bout.write(2);
bout.write(3);
核心方法--擷取記憶體緩沖中的資料--位元組數組
byte[] buf=bout.toByteArray();
System.out.println(buf.length+","+buf.getClass());
for(int i=0;i<buf.length;i++)
{
System.out.println(buf[i]);
}
bout.close();
System.out.println("輸出流結束。。。輸入流開始。。。");
//ByteArrayInputStream: 可以将位元組數組轉化為輸入流
ByteArrayInputStream bin=new ByteArrayInputStream(buf);
int data=0;
while( (data=bin.read())!=-1)
{
System.out.println(data);
}
bin.close();
}
result as follows :
3,class [B // 表示Byte數組
1
2
3
輸出流結束。。。輸入流開始。。。
1
2
3
如果輸入英文字元,将會輸出其ASCII值:
如a 的ascii為97,i 為105
bout.write('i');
bout.write(2);
bout.write(3);
result as follows :
3,class [B
105
2
3
輸出流結束。。。輸入流開始。。。
105
2
3
【2】與DataOutputStream&DataInputStream聯合使用
執行個體代碼如下:
@Test
public void testBAOPStream() throws IOException{
//與DataOutputStream&DataInputStream聯合使用:
ByteArrayOutputStream bout=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(bout);
String name="suntao";
int age=19;
dos.writeUTF(name);
dos.writeInt(age);
//擷取記憶體緩沖區中的資料
byte[] buf=bout.toByteArray();
for(int i=0;i<buf.length;i++)
{
// System.out.println((char)buf[i]);
System.out.println(buf[i]);
}
System.out.println(new String(buf));
System.out.println(new String(buf).trim());
dos.close();
bout.close();
ByteArrayInputStream bin=new ByteArrayInputStream(buf);
DataInputStream dis=new DataInputStream(bin);
name=dis.readUTF();//從位元組數組中讀取,自動進行編碼轉換
age=dis.readInt();
System.out.println("name :"+name+","+"age :"+age);
dis.close();
bin.close();
}
result as follows :
115-s , ,97 - a
【3】與System.in,System.out配合使用
測試示例如下:
import java.io.*;
public class ByteStreamTest {
public static void main(String args[])throws IOException {
ByteArrayOutputStream bOutput = new ByteArrayOutputStream(12);
while( bOutput.size()!= 10 ) {
// 擷取使用者輸入
bOutput.write(System.in.read());
}
byte b [] = bOutput.toByteArray();
System.out.println("Print the content");
for(int x= 0 ; x < b.length; x++) {
// 列印字元
System.out.print((char)b[x] + " ");
}
System.out.println(" ");
int c;
ByteArrayOutputStream bInput = new ByteArrayOutputStream(b);
System.out.println("Converting characters to Upper case " );
for(int y = 0 ; y < 1; y++ ) {
while(( c= bInput.read())!= -1) {
System.out.println(Character.toUpperCase((char)c));
}
bInput.reset();
}
}
}
result as follows :
adfsdfsfdas
Print the content
a d f s d f s f d a
Converting characters to Upper case
A
D
F
S
D
F
S
F
D
A
【4】與ObjectInputStream&ObjectOutputStream聯合使用
這裡模拟使用Redis的Jedis進行對象的存取。
public static void setexObj(String key, int seconds, Object obj) throws Exception {
Jedis jedis = RedisCachedFactory.getJedis();
jedis.setex(key.getBytes(), seconds, serialize(obj));
RedisCachedFactory.close(jedis);
}
public static Object getObj(String key) throws Exception {
Object obj = null;
Jedis jedis = RedisCachedFactory.getJedis();
obj = unserialize(jedis.get(key.getBytes()));
RedisCachedFactory.close(jedis);
return obj;
}
//将對象序列化為位元組數組
public static byte[] serialize(Object object) throws Exception {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
//拿到位元組數組
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
throw new Exception(e);
}
}
//将位元組數組反序列化為對象
public static Object unserialize(byte[] bytes) throws Exception {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
throw new Exception(e);
}
}