`
java-admin
  • 浏览: 1381802 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

ByteArrayOutputStream和ByteArrayInputStream详解

阅读更多

http://www.blogjava.net/rainmanyang/articles/232045.html

 

 

ByteArrayOutputStream和ByteArrayInputStream详解

ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:

ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组。

ByteArrayInputStream: 可以将字节数组转化为输入流

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

20 }

21}

22
23
24

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

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

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

18}

 

 

 

 

 

第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下。

  ByteArrayOutputStream的用法

以下是JDK中的记载: 

public class ByteArrayOutputStream  extends OutputStream

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

    关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException

   我的个人理解是ByteArrayOutputStream是用来缓存数据的(数据写入的目标(output stream原义)),向它的内部缓冲区写入数据,缓冲区自动增长,当写入完成时可以从中提取数据。由于这个原因,ByteArrayOutputStream常用于存储数据以用于一次写入。

实例:

从文件中读取二进制数据,全部存储到ByteArrayOutputStream中。

FileInputStream fis=new FileInputStream("test");

BufferedInputStream bis=new BufferedInputStream(fis);

ByteArrayOutputStream baos=new ByteArrayOutputStream();

int c=bis.read();//读取bis流中的下一个字节

while(c!=-1){

     baos.write(c);

     c=bis.read();

}

bis.close();

byte retArr[]=baos.toByteArray();

 

ByteArrayInputStream的用法

    相对而言,ByteArrayInputStream比较少见。先看JDK文档中的介绍:

public class ByteArrayInputStreamextends InputStreamByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。

关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

构造函数:

ByteArrayInputStream(byte[] buf) 

注意它需要提供一个byte数组作为缓冲区。

    与大部分Inputstream的语义类似,可以从它的缓冲区中读取数据,所以我们可以在它的外面包装另一层的inputstream以使用我们需要的读取方法。

    个人认为一个比较好的用途是在网络中读取数据包,由于数据包一般是定长的,我们可以先分配一个够大的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方法,读取指定的字节

比如第一个字节是版本号,dis_2.readByte();

等等……

上面的示例的两次包装看上去有点多此一举,但使用ByteArrayInputStream的好处是关掉流之后它的数据仍然存在。

分享到:
评论

相关推荐

    io流详解代码

    - `ByteArrayInputStream`和`ByteArrayOutputStream`可以在内存中创建一个字节数组流,用于临时存储数据。 8. **异常处理**: - 在进行IO操作时,必须妥善处理`IOException`。通常,我们使用try-catch块来捕获并...

    Java中IO解读与使用实例-动力节点共17页.pdf

    3. ByteArrayOutputStream和ByteArrayInputStream:内存中的字节流,常用于临时存储数据。 4. PipedInputStream和PipedOutputStream:用于线程间的数据传递。 五、IO流的关闭 在完成IO操作后,一定要记得关闭流,...

    java_io详解

    具体的数据源类如`FileInputStream`、`FileOutputStream`、`ByteArrayInputStream`、`ByteArrayOutputStream`等,以及提供装饰功能的类如`BufferedInputStream`、`BufferedOutputStream`、`DataInputStream`、`...

    JAVA-IO详解,方法和例子

    - 输入流:ByteArrayInputStream、StringBufferInputStream、FileInputStream、PipedInputStream和SequenceInputStream。 - 输出流:ByteArrayOutputStream、FileOutputStream、PipedOutputStream和...

    JAVA IO流详解

    ### JAVA IO流详解 在Java编程中,IO流(Input/Output Stream)是处理输入输出操作的核心机制。本文将深入探讨Java IO流的基本概念、分类以及常见流的使用方法,帮助初学者理解并掌握这一重要知识点。 #### 一、...

    Java I/O层次结构详解

    - **ByteArrayInputStream和ByteArrayOutputStream**:在内存中读写字节流。 - **CharArrayReader和CharArrayWriter**:处理字符数组的读写。 8. **管道流(Pipe Stream)** - **PipedReader和PipedWriter**:线程...

    Java_IO流详解

    它们各自都有多个子类,如`FileInputStream`、`FileOutputStream`、`ByteArrayInputStream`、`ByteArrayOutputStream`等,以满足不同的数据处理需求。 - **Reader和Writer**:这些是字符流的基础,主要用于处理字符...

    java_IO 详解java_IO 详解

    `OutputStream` 是所有字节输出流的父类,其子类包括 `FileOutputStream`(用于写入文件)和 `ByteArrayOutputStream`(用于写入字节数组)等。在 Java 1.1 版本后,引入了 `Reader` 和 `Writer` 类,用于处理字符流...

    32.9、java io详解1

    在 Java 中,字节流和字符流都有着各自的类和方法,如 ByteArrayInputStream、ByteArrayOutputStream、BufferedReader、BufferedWriter 等。这些类和方法可以帮助开发者更方便地进行 IO 操作。 在实际开发中,需要...

    五,Android文件IO详解.doc

    - **内存流**:如ByteArrayInputStream和ByteArrayOutputStream用于在内存中处理数据。 - **字符串流**:StringReader和StringWriter用于字符串的读写。 - **管道流**:PipedInputStream和PipedOutputStream用于...

    JAVA-IO详解.txt

    ### JAVA-IO详解 #### 一、概述与基础概念 在Java编程语言中,输入输出(简称IO)处理是程序开发中的一个基本且重要的部分。Java IO系统主要由两大类构成:字节流(Byte Stream)和字符流(Character Stream)。这...

    Android中图片压缩方案详解样本.doc

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while (baos.toByteArray().length / 1024 &gt; 100) { baos.reset(); ...

    java输入输出流详解.doc

    - **`ByteArrayInputStream`** 和 **`ByteArrayOutputStream`**: 在内存中创建字节流。 - **`CharArrayReader`** 和 **`CharArrayWriter`**: 在内存中创建字符流。 #### 七、示例代码解析 在部分给定内容中,有一...

    详解Java中ByteArray字节数组的输入输出流的用法

    ByteArrayInputStream和ByteArrayOutputStream是Java IO体系中两个非常实用的类,它们分别用于处理字节数组的输入和输出。 **ByteArrayInputStream介绍** ByteArrayInputStream是InputStream的子类,它允许我们将...

    IO流详解学习

    ### IO流详解学习 #### 一、概述 IO流(Input/Output Stream)是Java编程语言中用于处理数据输入和输出的重要技术之一。通过IO流,开发者能够与外部世界进行数据交互,包括从文件系统、网络等处读取数据或将数据...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    ByteArrayInputStream inStream = new ByteArrayInputStream(byteStream.toByteArray()); ObjectInputStream in = new ObjectInputStream(inStream); MyClass cloned = (MyClass) in.readObject(); return ...

    java 中HttpClient传输xml字符串实例详解

    InputStreamEntity inputStreamEntity = new InputStreamEntity(new ByteArrayInputStream(out.toByteArray())); ``` 最后,我们需要使用HttpClient发送POST请求。首先,创建一个`CloseableHttpClient`实例,然后...

    javaio详解【2】.pdf

    例如,`FileInputStream`和`FileOutputStream`用于文件的读写,`ByteArrayInputStream`和`ByteArrayOutputStream`则允许在内存中操作字节流。字节流适用于处理任何类型的二进制数据,如图片、音频文件等。 字符流...

    Android中图片压缩方案详解及源码下载

    在Android开发中,图片压缩是一项重要的技术,尤其在处理大图片和多图片场景时,能够有效地防止因内存消耗过大导致的Out Of Memory (OOM)异常。本文将详细讲解两种常用的Android图片压缩方法,并提供源码供参考。 1...

Global site tag (gtag.js) - Google Analytics