`
小驴变黑马
  • 浏览: 12026 次
文章分类
社区版块
存档分类

BufferedOutputStream和ByteArrayOutputStream区别

 
阅读更多

众所周知BufferedOutputStream是一个缓冲数据输出流接口, ByteArrayOutputStream则是字节数组输出流接口. 这2个输出流都是我们经常用到的, 它们都是OutputStream的子类,而什么时候选择用它们呢, 这个就要看你运用到什么应用场景下了. 

下来先来看下源码吧. 

1.BufferedOutputStream会首先创建一个默认的容器量, capacity = 8192 = 8KB, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就flushBuffer(), 把buf中的数据写入对应的outputStream中, 然后将buf清空, 一直这样等到把内容写完. 在这过程中主要起到了一个数据缓冲的功能. 

Java代码  收藏代码
  1. public synchronized void write(byte b[], int off, int len) throws IOException {  
  2.       // 在这判断需要写的数据长度是否已经超出容器的长度了,如果超出则直接写到相应的outputStream中,并清空缓冲区  
  3.       if (len >= buf.length) {  
  4.           flushBuffer();  
  5.           out.write(b, off, len);  
  6.           return;  
  7.       }  
  8.       // 判断缓冲区剩余的容量是否还够写入当前len的内容,如果不够则清空缓冲区  
  9.       if (len > buf.length - count) {  
  10.           flushBuffer();  
  11.       }  
  12.       // 将要写的数据先放入内存中,等待数据达到了缓冲区的长度后,再写到相应的outputStream中  
  13.       System.arraycopy(b, off, buf, count, len);  
  14.       count += len;  
  15.     }  



flushBuffer () 这个方法干了些什么呢, 来看看源码 

Java代码  收藏代码
  1. private void flushBuffer() throws IOException {  
  2.        if (count > 0) {  
  3.           // 把写入内存中的数据写到构造方法里传入的OutputStream句柄里, 并把容量大小清楚  
  4.     out.write(buf, 0, count);  
  5.     count = 0;  
  6.        }  
  7.    }  



这个类最重要的就是这2个方法, 这样节省了大量的内存空间, 合理的分配内存来完成数据输出,当你资源不是那么充沛时, 选择这个类来实现你想要的东西是不是很合适呢? 

2.普通的OutputStream, 例如ByteArrayOutputStream也会首先创建一个默认的容器量, capacity = 32 = 32b, 每次在写的时候都会去比对capacity是否还够用, 如果不够用的时候, 就重新创建buf的容量, 一直等到内容写完, 这些数据都会一直处于内存中. 

Java代码  收藏代码
  1. public synchronized void write(byte b[], int off, int len) {  
  2.       if ((off < 0) || (off > b.length) || (len < 0) ||  
  3.             ((off + len) > b.length) || ((off + len) < 0)) {  
  4.           throw new IndexOutOfBoundsException();  
  5.       } else if (len == 0) {  
  6.           return;  
  7.       }  
  8.         // 不断对自己的容量进行相加  
  9.         int newcount = count + len;  
  10.         // 如果新的容量大小已经超过了现有的大小时,则重新开辟新的内存区域来保存当前的数据  
  11.         if (newcount > buf.length) {  
  12.             buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));  
  13.         }  
  14.         System.arraycopy(b, off, buf, count, len);  
  15.         count = newcount;  
  16.     }  



注释中已经对这个类进行了详细的解释 

总结 : 当你资源不足够用时,选择BufferedOutputStream是最佳的选择, 当你选择快速完成一个作业时,可以选择ByteArrayOutputStream之类的输出流

分享到:
评论

相关推荐

    InputStream与OutputStream及File间互转

    这可以通过创建一个临时缓冲区实现,例如使用`BufferedInputStream`和`BufferedOutputStream`,或者使用`IOUtils`类(来自Apache Commons IO库): ```java // 使用Buffered streams BufferedInputStream in = ...

    JAVA解析PPT教案学习.pptx

    常用的节点流包括与文件操作相关的FileInputStream和FileOutputStream,以及处理内存数据的ByteArrayInputStream和ByteArrayOutputStream。处理流则包括BufferedInputStream、BufferedOutputStream、DataInputStream...

    java学习大纲java学习大纲.doc

    位元串流如InputStream和OutputStream处理二进制数据,常见的有FileInputStream和FileOutputStream,以及缓冲流BufferedInputStream和BufferedOutputStream,还有DataInputStream和DataOutputStream用于处理基本数据...

    Android应用源码之IOStreamSample_Android.zip

    2. ByteArrayInputStream和ByteArrayOutputStream:在内存中操作字节数组。 3. InputStreamReader和OutputStreamWriter:将字节流转换为字符流,支持不同字符编码。 4. BufferedReader和BufferedWriter:提供缓冲...

    JAVA-IO详解,方法和例子

    - 输出流:ByteArrayOutputStream、FileOutputStream、PipedOutputStream和SequenceOutputStream。 - **字符流**:以Unicode字符为单位处理数据,同样包含输入流和输出流。常见的字符流有: - 输入流:...

    java输入输出流总结.pdf

    - ByteArrayInputStream 和 ByteArrayOutputStream 分别用于内存中的字节输入和输出。 - FilterInputStream 和 FilterOutputStream 提供了过滤和装饰流的功能,可以添加额外的处理逻辑。 - DataInputStream 和 ...

    Java SE API技巧.pdf

    在Java中,我们有`BufferedInputStream`和`BufferedOutputStream`这两个类,它们分别用于处理字节流的输入和输出。通过使用缓冲区,我们可以一次性读取或写入多个字节,而不是每次处理一个字节,从而显著提升性能。 ...

    浅谈Java的输入输出流

    OutputStream的常见子类有FileOutputStream和ByteArrayOutputStream,它们分别用于向文件和字节数组写入数据。 而字符流主要用于文本数据的处理,Reader的常见子类有FileReader和BufferedReader,FileReader直接从...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    FileWriter、FileReader、CharArrayReader、CharArrayWriter、...ByteArrayOutputStream、SequenceInputStream、BufferedOutputStream、BufferedInputStream、PipedReader、PipedWriter、PipedInputStream、...

    java输入输出流.ppt

    而处理流是对已有流的包装,增加额外的功能,如BufferedInputStream和BufferedOutputStream提供缓冲,FilterInputStream和FilterOutputStream提供过滤机制。 此外,Java还提供了特殊用途的流,如ObjectInputStream...

    Io框架与类图

    `FilterInputStream`和`FilterOutputStream`同样提供过滤功能,例如`BufferedInputStream`和`BufferedOutputStream`提供缓冲,`DataInputStream`和`DataOutputStream`支持基本数据类型的读写。`ObjectInputStream`和...

    JAVA_字节流和字符流

    `ByteArrayInputStream`和`ByteArrayOutputStream`,用于内存中的数据操作。 - 字节流处理数据时,每次读写一个字节,适合处理二进制数据,例如图片、音频文件等。 - 字节流可以使用缓冲技术提高效率,如`...

    IO流各个类的使用方法

    BufferedOutputStream ObjectInputStream ObjectOutputStream ByteArrayInputStream ByteArrayOutputStream 【字符流】 Reader Writer InputStreamReader OutputStreamWriter BufferedReader BufferedWriter /...

    Java io输入输出流及字符集

    BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter提供缓冲功能,可以减少频繁的物理读写操作,提高性能。 五、转换流 InputStreamReader和OutputStreamWriter用于在字节流和字符流之间...

    Java数据压缩与传输实例.rar

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) { gzos.write(originalText.getBytes()); } byte[] compressedData = baos....

    输入输出流的见解

    - 输出流:包含`ByteArrayOutputStream`(向字节数组写入)、`FileOutputStream`(向文件写入)、`PipedOutputStream`(线程间通信)和`SequenceOutputStream`(合并多个输出流)。 2. **以Unicode字符为导向的流*...

    IO流-它代表了数据的无结构化传递

    常见的字节流类有`FileInputStream`、`FileOutputStream`、`ByteArrayInputStream`和`ByteArrayOutputStream`。 - `BufferedInputStream`和`BufferedOutputStream`提供缓冲功能,提高了读写性能。例如,`...

    javaIO流[归纳].pdf

    BufferedInputStream和BufferedOutputStream虽然用处较小,但也可以提供性能提升。 6. **转换流**:InputStreamReader和OutputStreamWriter作为转换流,将字节流转换为字符流,它们在构造时可以指定字符编码。 7. ...

    java I/O类的使用

    `BufferedInputStream`和`BufferedOutputStream`提供了缓冲功能,提高了读写效率;`PrintStream`和`PrintWriter`则方便了打印和格式化输出;`InputStreamReader`和`OutputStreamWriter`通过字符编码转换,使字节流和...

Global site tag (gtag.js) - Google Analytics