字节数组流ByteArrayOut(In)putStream使用详解

简介: 字节数组流ByteArrayOut(In)putStream使用详解

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

关联博文:字节输出流在SpringMVC文件下载中的使用




目录
相关文章
|
存储 安全 开发工具
oss加密存储
阿里云OSS为数据安全提供多种加密机制,包括服务器端的SSE-S3(AES-256透明加密)、SSE-C(用户管理密钥)和CSE-KMS(结合KMS进行密钥管理)。此外,OSS支持客户端加密SDK和HTTPS传输加密,确保数据在传输和存储时的安全。通过ACL、Bucket策略和访问密钥身份验证,实现权限控制与身份验证,全方位保障用户数据的安全性和隐私。用户可按需选择适合的加密方式。
1368 2
|
SQL Oracle 关系型数据库
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
955 0
|
12月前
|
缓存 小程序 Cloud Native
《Unity小程序开发的实战技术教程》
本文聚焦Unity游戏适配小程序的核心技术实践,跳出传统原生移植思维,提出“场景化轻重构”的创新路径。文章围绕六大核心技术维度展开:以“微沉浸”逻辑重构游戏体验,契合小程序碎片化使用场景;通过“颗粒化拆分+智能预载矩阵”优化资源管理,破解加载与内存瓶颈;构建“轻交互链”体系,适配小程序触摸特性与社交生态;搭建“云原生数据桥”实现跨端无缝同步;整合“轻量化工具链”打通开发全流程;采用“动态性能阈值管理”实现资源约束下的体验最大化。整套技术方案融合独特实践经验与创新思维,摒弃冗余理论,聚焦实操逻辑,为Unity开发者提供适配小程序生态的高效路径,助力游戏实现“小而精”的跨端体验升维。
433 8
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
关系型数据库 API Apache
Flink CDC:基于 Apache Flink 的流式数据集成框架
本文整理自阿里云 Flink SQL 团队研发工程师于喜千(yux)在 SECon 全球软件工程技术大会中数据集成专场沙龙的分享。
24483 11
Flink CDC:基于 Apache Flink 的流式数据集成框架
|
存储 算法 安全
|
存储 Java 索引
String和Char的区别
String和Char的区别
2727 1