ByteArrayOutputStream和ByteArrayInputStream
2013-10-24 10:07
513 查看
http://blog.csdn.net/rcoder/article/details/6118313
http://bbs.phpchina.com/blog-24549-142721.html
第一次看到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的好处是关掉流之后它的数据仍然存在。
ByteArrayOutputStream和ByteArrayInputStream详解
ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:
ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayInputStream: 可以将字节数组转化为输入流
1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
import java.io.*;
2
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
3
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/1fa987a29c6482f53d401256f96355eb.gif)
public class test {
4
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] args) {
5
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int a=0;
6
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int b=1;
7
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int c=2;
8
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
9
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(a);
10
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(b);
11
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(c);
12
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
byte[] buff = bout.toByteArray();
13
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
for(int i=0; i<buff.length; i++)
14
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(buff[i]);
15
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println("***********************");
16
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayInputStream bin = new ByteArrayInputStream(buff);
17
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
while((b=bin.read())!=-1) {
18
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(b);
19
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
20
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
21
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/8f1ba5b45633e9678d1db480c16cae3f.gif)
}
22
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
23
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
24
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
如上所示,ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.
综合DataOutputStream&DataInputStream的作用和功能,与ByteArrayOutputStream和ByteArrayInputSream使用将更方便.此时DataOutputStream&DataInputStream封闭了字节流,以适当的形式读出了字节数组中的数据.如下所示:
1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
import java.io.*;
2
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
3
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/1fa987a29c6482f53d401256f96355eb.gif)
public class test {
4
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] args)throws IOException {
5
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
6
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
DataOutputStream dout = new DataOutputStream(bout);
7
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
String name = "xxy";
8
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int age = 84;
9
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
dout.writeUTF(name);
10
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
dout.writeInt(age);
11
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
byte[] buff = bout.toByteArray();
12
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayInputStream bin = new ByteArrayInputStream(buff);
13
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
DataInputStream dis = new DataInputStream(bin);
14
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
String newName = dis.readUTF();
15
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int newAge = dis.readInt();
16
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(newName+":"+newAge);
17
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
18
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/8f1ba5b45633e9678d1db480c16cae3f.gif)
}
http://bbs.phpchina.com/blog-24549-142721.html
第一次看到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的好处是关掉流之后它的数据仍然存在。
ByteArrayOutputStream和ByteArrayInputStream详解
ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:
ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayInputStream: 可以将字节数组转化为输入流
1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
import java.io.*;
2
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
3
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/1fa987a29c6482f53d401256f96355eb.gif)
public class test {
4
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] args) {
5
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int a=0;
6
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int b=1;
7
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int c=2;
8
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
9
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(a);
10
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(b);
11
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
bout.write(c);
12
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
byte[] buff = bout.toByteArray();
13
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
for(int i=0; i<buff.length; i++)
14
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(buff[i]);
15
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println("***********************");
16
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayInputStream bin = new ByteArrayInputStream(buff);
17
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
while((b=bin.read())!=-1) {
18
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(b);
19
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
20
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
21
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/8f1ba5b45633e9678d1db480c16cae3f.gif)
}
22
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
23
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
24
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
如上所示,ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.
综合DataOutputStream&DataInputStream的作用和功能,与ByteArrayOutputStream和ByteArrayInputSream使用将更方便.此时DataOutputStream&DataInputStream封闭了字节流,以适当的形式读出了字节数组中的数据.如下所示:
1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
import java.io.*;
2
![](https://oscdn.geek-share.com/Uploads/Images/Content/201406/4f1150b881333f12a311ae9ef34da474.gif)
3
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/1fa987a29c6482f53d401256f96355eb.gif)
public class test {
4
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/97e794c86028c5f5b5461ae5ef440a4c.gif)
public static void main(String[] args)throws IOException {
5
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
6
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
DataOutputStream dout = new DataOutputStream(bout);
7
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
String name = "xxy";
8
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int age = 84;
9
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
dout.writeUTF(name);
10
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
dout.writeInt(age);
11
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
byte[] buff = bout.toByteArray();
12
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
ByteArrayInputStream bin = new ByteArrayInputStream(buff);
13
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
DataInputStream dis = new DataInputStream(bin);
14
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
String newName = dis.readUTF();
15
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
int newAge = dis.readInt();
16
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/d18c02628675d0a2c816449d98bda930.gif)
System.out.println(newName+":"+newAge);
17
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/ecedf933ec37d714bd4c2545da43add2.gif)
}
18
![](https://oscdn.geek-share.com/Uploads/Images/Content/200609/8f1ba5b45633e9678d1db480c16cae3f.gif)
}
相关文章推荐
- java.ByteArrayInputStream与ByteArrayOutputStream
- ByteArrayInputStream和ByteArrayOutputStream使用-黑马程序员
- java.io ByteArrayInputStream与ByteArrayOutputStream理解(二)
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
- DataOutputStream、DataInputStream、ByteArrayOutputStream、ByteArrayInputStream
- Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
- java.ByteArrayInputStream与ByteArrayOutputStream
- 15.1 ByteArrayInputStream(字节数组输入流)和ByteArrayOutputStream类(字节数组输出流)
- Java IO之DataInputStream,ObjectInputStream,ByteArrayInputStream等
- ByteArrayOutputStream和ByteArrayInputStream
- Java IO深入理解字节和字符数组(ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter)
- Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
- 黑马程序员-学习日志-ByteArrayInputStream
- java.ByteArrayInputStream与ByteArrayOutputStream再次理解 - CodeAnt的专栏 - 博客频道 - CSDN.NET http://blog.csdn.
- ByteArrayOutputStream和ByteArrayInputStream详解
- ByteArrayInputStream和ByteArrayOutputStream
- ByteArrayInputStream example
- Java之IO(三)ByteArrayInputStream和ByteArrayOutputStream
- java.ByteArrayInputStream-ByteArrayOutputStream
- ByteArrayInputStream和ByteArrayOutputStream