http://www.blogjava.net/rainmanyang/articles/232045.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的好处是关掉流之后它的数据仍然存在。
分享到:
相关推荐
- `ByteArrayInputStream`和`ByteArrayOutputStream`可以在内存中创建一个字节数组流,用于临时存储数据。 8. **异常处理**: - 在进行IO操作时,必须妥善处理`IOException`。通常,我们使用try-catch块来捕获并...
3. ByteArrayOutputStream和ByteArrayInputStream:内存中的字节流,常用于临时存储数据。 4. PipedInputStream和PipedOutputStream:用于线程间的数据传递。 五、IO流的关闭 在完成IO操作后,一定要记得关闭流,...
具体的数据源类如`FileInputStream`、`FileOutputStream`、`ByteArrayInputStream`、`ByteArrayOutputStream`等,以及提供装饰功能的类如`BufferedInputStream`、`BufferedOutputStream`、`DataInputStream`、`...
- 输入流:ByteArrayInputStream、StringBufferInputStream、FileInputStream、PipedInputStream和SequenceInputStream。 - 输出流:ByteArrayOutputStream、FileOutputStream、PipedOutputStream和...
### JAVA IO流详解 在Java编程中,IO流(Input/Output Stream)是处理输入输出操作的核心机制。本文将深入探讨Java IO流的基本概念、分类以及常见流的使用方法,帮助初学者理解并掌握这一重要知识点。 #### 一、...
- **ByteArrayInputStream和ByteArrayOutputStream**:在内存中读写字节流。 - **CharArrayReader和CharArrayWriter**:处理字符数组的读写。 8. **管道流(Pipe Stream)** - **PipedReader和PipedWriter**:线程...
它们各自都有多个子类,如`FileInputStream`、`FileOutputStream`、`ByteArrayInputStream`、`ByteArrayOutputStream`等,以满足不同的数据处理需求。 - **Reader和Writer**:这些是字符流的基础,主要用于处理字符...
`OutputStream` 是所有字节输出流的父类,其子类包括 `FileOutputStream`(用于写入文件)和 `ByteArrayOutputStream`(用于写入字节数组)等。在 Java 1.1 版本后,引入了 `Reader` 和 `Writer` 类,用于处理字符流...
在 Java 中,字节流和字符流都有着各自的类和方法,如 ByteArrayInputStream、ByteArrayOutputStream、BufferedReader、BufferedWriter 等。这些类和方法可以帮助开发者更方便地进行 IO 操作。 在实际开发中,需要...
- **内存流**:如ByteArrayInputStream和ByteArrayOutputStream用于在内存中处理数据。 - **字符串流**:StringReader和StringWriter用于字符串的读写。 - **管道流**:PipedInputStream和PipedOutputStream用于...
### JAVA-IO详解 #### 一、概述与基础概念 在Java编程语言中,输入输出(简称IO)处理是程序开发中的一个基本且重要的部分。Java IO系统主要由两大类构成:字节流(Byte Stream)和字符流(Character Stream)。这...
ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while (baos.toByteArray().length / 1024 > 100) { baos.reset(); ...
- **`ByteArrayInputStream`** 和 **`ByteArrayOutputStream`**: 在内存中创建字节流。 - **`CharArrayReader`** 和 **`CharArrayWriter`**: 在内存中创建字符流。 #### 七、示例代码解析 在部分给定内容中,有一...
ByteArrayInputStream和ByteArrayOutputStream是Java IO体系中两个非常实用的类,它们分别用于处理字节数组的输入和输出。 **ByteArrayInputStream介绍** ByteArrayInputStream是InputStream的子类,它允许我们将...
### IO流详解学习 #### 一、概述 IO流(Input/Output Stream)是Java编程语言中用于处理数据输入和输出的重要技术之一。通过IO流,开发者能够与外部世界进行数据交互,包括从文件系统、网络等处读取数据或将数据...
ByteArrayInputStream inStream = new ByteArrayInputStream(byteStream.toByteArray()); ObjectInputStream in = new ObjectInputStream(inStream); MyClass cloned = (MyClass) in.readObject(); return ...
InputStreamEntity inputStreamEntity = new InputStreamEntity(new ByteArrayInputStream(out.toByteArray())); ``` 最后,我们需要使用HttpClient发送POST请求。首先,创建一个`CloseableHttpClient`实例,然后...
例如,`FileInputStream`和`FileOutputStream`用于文件的读写,`ByteArrayInputStream`和`ByteArrayOutputStream`则允许在内存中操作字节流。字节流适用于处理任何类型的二进制数据,如图片、音频文件等。 字符流...
在Android开发中,图片压缩是一项重要的技术,尤其在处理大图片和多图片场景时,能够有效地防止因内存消耗过大导致的Out Of Memory (OOM)异常。本文将详细讲解两种常用的Android图片压缩方法,并提供源码供参考。 1...