又是好久没写博客了, 今天也心血来潮, 把以前的笔记整理了一下, 一点点发出来.
今天主要是想记录下BufferedOutputStream和ByteArrayOutputStream区别
众所周知BufferedOutputStream是一个缓冲数据输出流接口, ByteArrayOutputStream则是字节数组输出流接口. 这2个输出流都是我们经常用到的, 它们都是OutputStream的子类,而什么时候选择用它们呢, 这个就要看你运用到什么应用场景下了.
下来先来看下源码吧.
1.BufferedOutputStream会首先创建一个默认的容器量, capacity = 8192 = 8KB, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就flushBuffer(), 把buf中的数据写入对应的outputStream中, 然后将buf清空, 一直这样等到把内容写完. 在这过程中主要起到了一个数据缓冲的功能.
public synchronized void write(byte b[], int off, int len) throws IOException {
// 在这判断需要写的数据长度是否已经超出容器的长度了,如果超出则直接写到相应的outputStream中,并清空缓冲区
if (len >= buf.length) {
flushBuffer();
out.write(b, off, len);
return;
}
// 判断缓冲区剩余的容量是否还够写入当前len的内容,如果不够则清空缓冲区
if (len > buf.length - count) {
flushBuffer();
}
// 将要写的数据先放入内存中,等待数据达到了缓冲区的长度后,再写到相应的outputStream中
System.arraycopy(b, off, buf, count, len);
count += len;
}
flushBuffer () 这个方法干了些什么呢, 来看看源码
private void flushBuffer() throws IOException {
if (count > 0) {
// 把写入内存中的数据写到构造方法里传入的OutputStream句柄里, 并把容量大小清楚
out.write(buf, 0, count);
count = 0;
}
}
这个类最重要的就是这2个方法, 这样节省了大量的内存空间, 合理的分配内存来完成数据输出,
当你资源不是那么充沛时, 选择这个类来实现你想要的东西是不是很合适呢?
2.普通的OutputStream, 例如ByteArrayOutputStream也会首先创建一个默认的容器量, capacity = 32 = 32byte, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就重新创建buf的容量, 一直等到内容写完, 这些数据都会一直处于内存中.
public synchronized void write(byte b[], int off, int len) {
if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
// 不断对自己的容量进行相加
int newcount = count + len;
// 如果新的容量大小已经超过了现有的大小时,则重新开辟新的内存区域来保存当前的数据
if (newcount > buf.length) {
buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
}
System.arraycopy(b, off, buf, count, len);
count = newcount;
}
注释中已经对这个类进行了详细的解释
总结 : 当你资源不足够用时,选择BufferedOutputStream是最佳的选择, 当你选择快速完成一个作业时,可以选择ByteArrayOutputStream之类的输出流
分享到:
相关推荐
在Java编程语言中,`InputStream`和`OutputStream`是处理数据流的核心类,它们属于Java的I/O(Input/Output)框架。`File`类则用于处理文件操作,如读写、创建、删除等。理解如何在这些对象之间进行转换是Java开发中...
`InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...
IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...
本教程将聚焦于Java的基础核心,以及两个重要的I/O(输入/输出)流类——InputStream和OutputStream,它们在文件操作中扮演着关键角色。 InputStream和OutputStream是Java.io包下的抽象类,是所有字节流的基类。...
2. **BufferedInputStream与BufferedOutputStream**: 为了提高性能,Java提供了缓冲流,它们在InputStream和OutputStream的基础上添加了一个内部缓冲区。通过BufferedInputStream和BufferedOutputStream,可以批量...
InputStream和OutputStream** - **InputStream**:所有字节输入流的父类,提供了基本的读取方法。 - **继承层次**: - `InputStream` - `FileInputStream` - `BufferedInputStream` - `DataInputStream` - ....
**3.7 Java与XML联合编程之SAX篇** - **SAX解析** - 使用 SAX 进行增量式解析。 **3.8 Java与XML联合编程之DOM篇** - **DOM解析** - 使用 DOM 对整个文档进行操作。 #### 四、其他 **4.1 代码复用的规则** -...
1. 字节流:字节流是最基础的I/O流,包括InputStream和OutputStream。InputStream用于读取原始字节,如文件、网络数据等;OutputStream则用于写入原始字节。它们有多个子类,如FileInputStream和FileOutputStream...
1. **基础流与缓冲流**:Java的基础流包括字符流(Reader和Writer)和字节流(InputStream和OutputStream),它们直接处理原始的字节或字符。而缓冲流(BufferedReader、BufferedWriter、BufferedInputStream、...
1. **InputStream 和 OutputStream**: 这是Java I/O的基础,分别代表了数据的输入和输出。InputStream用于读取原始字节流,而OutputStream用于写入原始字节流。例如,FileInputStream和FileOutputStream分别用于从...
- 字节流:InputStream和OutputStream - 字符流:Reader和Writer - 文件流缓冲区:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 11. **第十一章:面向对象进阶** - 接口:定义...
1. Java IO:Java标准IO系统包括InputStream、OutputStream、Reader、Writer等类,用于读写数据。在网络编程中,通常使用BufferedInputStream和BufferedOutputStream进行缓冲,提高效率。 2. NIO(New Input/Output...
Java的I/O流系统主要由两个核心接口构成:InputStream和OutputStream用于处理字节流,Reader和Writer则用于处理字符流。这些接口提供了基本的读写方法,例如read()和write(),允许程序从输入源读取数据或向输出目标...
- 字节流和字符流:InputStream/OutputStream处理二进制数据,Reader/Writer处理文本数据。 - 缓冲流:BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter提高读写效率。 - 对象序列化:...
它们继承自`InputStream`和`OutputStream`,并提供了与文件系统交互的能力。 3. `BufferedInputStream` 和 `BufferedOutputStream`:这些类用于提高I/O性能,通过内部缓冲区实现批量读写。 4. `DataInputStream` ...
### Java程序设计之输入输出详解 #### 一、引言 在Java程序设计中,输入输出(I/O)是一项非常重要的技术。无论是简单的控制台应用还是复杂的企业级系统,都需要处理来自不同来源的数据输入和输出。Java语言通过其...
1. **InputStream与OutputStream**: - **InputStream**:这是所有字节输入流的基类,提供了一套基本的方法来读取字节数据。例如,`FileInputStream`用于从文件中读取数据,而`ByteArrayInputStream`则允许从内存中...
开源Winzip压缩工具的Java版源码是Java技术在实用工具开发领域的体现,它允许开发者利用Java来实现文件的压缩与解压功能,类似于流行的Winzip软件。这个开源项目为学习和理解文件压缩算法以及Java I/O流的使用提供了...
- **网络I/O**:Java的InputStream和OutputStream类族在处理网络数据传输时起到关键作用,如SocketInputStream和SocketOutputStream。 - **缓冲和对象序列化**:BufferedInputStream和BufferedOutputStream用于...
### JAVA课件_chapter6-File-Stream知识点详解 #### 一、文件与流的基本概念 ...综上所述,文件与流在Java编程中扮演着极其重要的角色,掌握了这些基础知识,能够帮助开发者更好地进行文件操作和数据传输。