Java提供了很丰富的io接口,已经可以满足我们大部分读取数据的需求,这个在C读取数据需要自己定义缓冲区数组大小,而且要小心翼翼的防止缓冲区溢出的情况相当不同。一般情况下我们读取的数据都是直接读取成为String类型的,可是有些时候还是难免要读取成为二进制的数据。

  1. public int read(byte b[]) throws IOException {
  2. t;span style="white-space:pre">  </span>return readBytes(b, 0, b.length);
  3. }

这个是java提供Inputstream的接口,我们必须定义一个byte数组去接收数据,而且我们根本不知道数据有多大,这个时候就要自己写数据缓冲区还有自动增长的数组,太麻烦了。

Java已经提供了一个叫做ByteArrayOutputStream的类,这个类实现了一个输出流,内部的数据是写进自身维护的一个自动增长的byte数组,而且可以使用toByteArray()还有toString()来获得数据。

  1. public static byte[] read(InputStream in) throws IOException {
  2. BufferedInputStream bis = new BufferedInputStream(in);
  3. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4. int c = bis.read();
  5. while((c!=-1)){
  6. baos.write(c);
  7. c = bis.read();
  8. }
  9. bis.close();
  10. return baos.toByteArray();
  11. }

之所以为什么用Buffer来缓冲流来封装输入流,是因为使用了Buffer,jvm会自动把数据读取进去缓冲区,然后再从缓冲区直接读取,比直接从inputstream一个字节一个字节读取效率高。

============================================================================================================

  ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,

然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。

在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。

具体用法如下: 
ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组  (从数组写)

ByteArrayInputStream: 可以将字节数组转化为输入流   (从数组读)

 1 public static void main(String[] args) {
2 int a = 0;
3 int b = 1;
4 int c = 2;
5 ByteArrayOutputStream bout = new ByteArrayOutputStream();
6 bout.write(a);
7 bout.write(b);
8 bout.write(c);
9 byte[] buff = bout.toByteArray();
10 for (int i = 0; i < buff.length; i++)
11 System.out.println(buff[i]);
12 System.out.println("***********************");
13 ByteArrayInputStream bin = new ByteArrayInputStream(buff);
14 while ((b = bin.read()) != -1) {
15 System.out.println(b);
16 }
17 }

如上所示,ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.

综合DataOutputStream&DataInputStream的作用和功能,与ByteArrayOutputStream和ByteArrayInputSream使用将更方便.此时DataOutputStream&DataInputStream封闭了字节流,以适当的形式读出了字节数组中的数据.如下所示:

 1 public static void main(String[] args) throws IOException {
2 ByteArrayOutputStream bout = new ByteArrayOutputStream();
3 DataOutputStream dout = new DataOutputStream(bout);
4 String name = "xxy";
5 int age = 84;
6 dout.writeUTF(name);
7 dout.writeInt(age);
8 byte[] buff = bout.toByteArray();
9 ByteArrayInputStream bin = new ByteArrayInputStream(buff);
10 DataInputStream dis = new DataInputStream(bin);
11 String newName = dis.readUTF();
12 int newAge = dis.readInt();
13 System.out.println(newName + ":" + newAge);
14 }

概述

  • 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据

ByteArrayOutputStream

  • 构造方法
构造方法 说明
ByteArrayOutputStream() 创建一个新的 byte 数组输出流
ByteArrayOutputStream(int size) 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)
  • 方法
方法 说明
write(int b) 将指定的字节写入此 byte 数组输出流
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流
toByteArray() 创建一个新分配的 byte 数组
toString() 使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串
toString(String charsetName) 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
FileInputStream input = null;

try{
// 创建输入流和内存输出流
input = new FileInputStream("a.txt");
ByteArrayOutputStream output = new ByteArrayOutputStream(); int b;
// 从文件读取数据,并写入到内存缓冲区中
while((b = input.read()) > 0) {
output.write(b);
} // 第一种获得数据的方式: 调用toByteArray方法,返回内存中的数据
byte[] byteArray = output.toByteArray();
System.out.println(new String(byteArray)); // 第二种获得数据的方式:调用toString方法,将内存中的数据解码成字符串
String content = output.toString();
System.out.println(content); }catch(IOException e) {
e.printStackTrace();
}finally {
try{
// 关闭输入流
if(input != null) {
input.close();
}
}catch(IOException e){
e.printStackTrace();
}
}

Java IO --ByteArrayOutputStream (六)***的更多相关文章

  1. 【java】内存流:java.io.ByteArrayInputStream、java.io.ByteArrayOutputStream、java.io.CharArrayReader、java.io.CharArrayWriter

    package 内存流; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java. ...

  2. Java IO(六) ObjectInputStream 和 ObjectOutputStream

    Java IO(六) ObjectInputStream 和 ObjectOutputStream 一.介绍 对于对象数据的处理,Java IO 提供了 ObjectInputStream 和 Obj ...

  3. 系统学习 Java IO (十六)----这么多类,应该用哪个?

    目录:系统学习 Java IO---- 目录,概览 Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原 ...

  4. Java IO: ByteArrayOutputStream使用

    感谢原文作者:小思思smile 原文链接:https://blog.csdn.net/u014049880/article/details/52329333/ 更多请查阅Java API文档! 在创建 ...

  5. java.io.ByteArrayOutputStream 源码分析

    ByteArrayOutputStream 内部包含了一个缓冲区,缓冲区会随着数据的不断写入而自动增长,俗称内存流. 首先看一下俩个属性,buf是内部缓冲区,count是记录写入了多少个字节. pro ...

  6. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

    类的继承关系 InputStream |__ ByteArrayInputStream OutputStream |__ ByteArrayOutputStream ByteArrayInputStr ...

  7. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  8. java io流 数据流 DataInputStream、DataOutputStream、ByteArrayInputStream、ByteArrayOutputStream

    例子程序: package io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ...

  9. Java IO 流-- 字节数组流ByteArrayInPutStream ByteArrayOutPutStream

    字节数组流输于缓冲流,放在jvm内存中,java可以直接操作.我们使用时可以不用关闭,交给GC垃圾回收机制处理. 当然我们为了保持良好习惯和代码一致性也可以加上关闭语句. 当其实我么打开ByteArr ...

随机推荐

  1. 如何自己实现session功能

    session字如其意,它的存在就是为了保持会话状态.PHP中的$_SESSION让我们很方便的使用它,但是如果PHP本身不提供这个功能,我们该如何实现呢?且听我慢慢忽悠. session的实现原理 ...

  2. 【05】AJAX实例-检测用户名是否存在(实例)

    AJAX实例-检测用户名是否存在   用户注册时,需要填写个人信息,其中包括用户名.当用户输入完成时,JavaScript 需要及时检测用户名是否存在,如果存在给出提示,请用户更换用户名. 当然,这个 ...

  3. 慕课笔记利用css进行布局【混合布局】

    <html> <head> <title>混合布局学习</title> <style type="text/css"> ...

  4. HDU 5458 Stability

    Stability Time Limit: 2000ms Memory Limit: 102400KB This problem will be judged on HDU. Original ID: ...

  5. 前端开发:JQuery(1)

    JQuery DOM文档加载的步骤: 1. 解析HTML结构: 2. 加载外部脚本和样式: 3. 解析并执行脚本代码: 4. DOM树构建完成: 5. 加载图片等外部文件: 6. 页面加载完成: JS ...

  6. JDK源码解析(一)ArrayList源码解析

    这里为了方便写注释,我是把ArrayList的源码复制下来放到自己创建的类里面的 这个变量则指向具体存放数据的数组 看下构造函数吧 点进去看下LinkedList是怎么数组化的 很弱智吧,就是创建一个 ...

  7. msp430入门学习00

    在TI官网上找到MSP430的程序例程.数据手册.使用指南等文件.以MSP430F169为例,步骤如下: 1)进入ti官网:http://www.ti.com.cn/ 或者http://www.ti. ...

  8. [bzoj2251][2010BeiJing Wc]外星联络_后缀数组

    外星联络 bzoj-2251 2010-BeiJing Wc 题目大意:题目链接. 注释:略. 想法: 这咋做啊????一看数据范围才$3\cdot 10^3$. 建立后缀数组. 所以我们将所有后缀排 ...

  9. Caocao's Bridges-HDU4738(Tarjin+求桥)

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意: 给定n个点和m条边  和每条边的价值,求桥的最小价值(最小桥) 看着挺简单的但是有好多细节: ...

  10. mybatis xml标签,批量插入

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...