天天看點

位元組數組流ByteArrayOut(In)putStream使用詳解

【1】位元組數組流

ByteArrayOutputStream: 可以捕獲記憶體緩沖區的資料,轉換成位元組數組(toByteArray()方法)。

ByteArrayInputStream: 可以将位元組數組轉換為輸入流。

位元組數組輸出流在記憶體中建立一個位元組數組緩沖區,所有發送到輸出流的資料儲存在該位元組數組緩沖區中。

類繼承示意圖如下:

位元組數組流ByteArrayOut(In)putStream使用詳解

主要屬性和方法如下:

位元組數組流ByteArrayOut(In)putStream使用詳解

測試示例如下:

@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

位元組數組流ByteArrayOut(In)putStream使用詳解

【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);
  }
}      

繼續閱讀