`
z276356445t
  • 浏览: 152165 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Java源码剖析之InputStream与OutputStream(1) --- BufferedOutputStream和普通ByteArrayOutputS

    博客分类:
  • Java
阅读更多
又是好久没写博客了, 今天也心血来潮, 把以前的笔记整理了一下, 一点点发出来.

今天主要是想记录下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之类的输出流
7
0
分享到:
评论
3 楼 z276356445t 2013-10-12  
jilo88 写道
java中的BufferedOutputStream 默认是new byte[8192]字节,ByteArrayOutputStream默认是new byte[32]字节,这里不是32kb;

笔误了,不好意思,谢谢捧场
2 楼 white_crucifix 2013-10-12  
估计楼主笔误吧
1 楼 jilo88 2013-10-12  
java中的BufferedOutputStream 默认是new byte[8192]字节,ByteArrayOutputStream默认是new byte[32]字节,这里不是32kb;



相关推荐

    InputStream与OutputStream及File间互转

    在Java编程语言中,`InputStream`和`OutputStream`是处理数据流的核心类,它们属于Java的I/O(Input/Output)框架。`File`类则用于处理文件操作,如读写、创建、删除等。理解如何在这些对象之间进行转换是Java开发中...

    java 文件存储 Inputstream outputstream reader writer的用法

    `InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的用法,并提供实际的代码示例,帮助初学者更好地理解和应用。 1. `InputStream`...

    IO流文档InputStream / OutputStream

    IO流是Java中的一种基本的数据交换方式,通过InputStream和OutputStream可以实现数据的读取和写入,而Reader和Writer可以实现字符流的读取和写入。IO流的知识点很多,需要认真学习和掌握。 InputStream的类型: * ...

    Java基础核心+InputStream输入流+OutputStream输出流

    本教程将聚焦于Java的基础核心,以及两个重要的I/O(输入/输出)流类——InputStream和OutputStream,它们在文件操作中扮演着关键角色。 InputStream和OutputStream是Java.io包下的抽象类,是所有字节流的基类。...

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    2. **BufferedInputStream与BufferedOutputStream**: 为了提高性能,Java提供了缓冲流,它们在InputStream和OutputStream的基础上添加了一个内部缓冲区。通过BufferedInputStream和BufferedOutputStream,可以批量...

    Java软件开发实战 Java基础与案例开发详解 13-3 流类的结构 共9页.pdf

    InputStream和OutputStream** - **InputStream**:所有字节输入流的父类,提供了基本的读取方法。 - **继承层次**: - `InputStream` - `FileInputStream` - `BufferedInputStream` - `DataInputStream` - ....

    (超赞)JAVA精华之--深入JAVA API

    **3.7 Java与XML联合编程之SAX篇** - **SAX解析** - 使用 SAX 进行增量式解析。 **3.8 Java与XML联合编程之DOM篇** - **DOM解析** - 使用 DOM 对整个文档进行操作。 #### 四、其他 **4.1 代码复用的规则** -...

    Java-se-io学习 Java学习资料源码

    1. 字节流:字节流是最基础的I/O流,包括InputStream和OutputStream。InputStream用于读取原始字节,如文件、网络数据等;OutputStream则用于写入原始字节。它们有多个子类,如FileInputStream和FileOutputStream...

    java输入输出--java实例17例

    1. **基础流与缓冲流**:Java的基础流包括字符流(Reader和Writer)和字节流(InputStream和OutputStream),它们直接处理原始的字节或字符。而缓冲流(BufferedReader、BufferedWriter、BufferedInputStream、...

    java_io.doc

    1. **InputStream 和 OutputStream**: 这是Java I/O的基础,分别代表了数据的输入和输出。InputStream用于读取原始字节流,而OutputStream用于写入原始字节流。例如,FileInputStream和FileOutputStream分别用于从...

    java 1-11章学习课件

    - 字节流:InputStream和OutputStream - 字符流:Reader和Writer - 文件流缓冲区:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 11. **第十一章:面向对象进阶** - 接口:定义...

    java-programowanie-sieciowe-[-PL-].rar_java programming

    1. Java IO:Java标准IO系统包括InputStream、OutputStream、Reader、Writer等类,用于读写数据。在网络编程中,通常使用BufferedInputStream和BufferedOutputStream进行缓冲,提高效率。 2. NIO(New Input/Output...

    java输入输出流.ppt

    Java的I/O流系统主要由两个核心接口构成:InputStream和OutputStream用于处理字节流,Reader和Writer则用于处理字符流。这些接口提供了基本的读写方法,例如read()和write(),允许程序从输入源读取数据或向输出目标...

    疯狂java讲义源码

    - 字节流和字符流:InputStream/OutputStream处理二进制数据,Reader/Writer处理文本数据。 - 缓冲流:BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter提高读写效率。 - 对象序列化:...

    java源码:Java二进制IO类与文件复制操作实例.rar

    它们继承自`InputStream`和`OutputStream`,并提供了与文件系统交互的能力。 3. `BufferedInputStream` 和 `BufferedOutputStream`:这些类用于提高I/O性能,通过内部缓冲区实现批量读写。 4. `DataInputStream` ...

    Java程序设计-Java-08-输入输出-PPT.ppt

    ### Java程序设计之输入输出详解 #### 一、引言 在Java程序设计中,输入输出(I/O)是一项非常重要的技术。无论是简单的控制台应用还是复杂的企业级系统,都需要处理来自不同来源的数据输入和输出。Java语言通过其...

    java_io.pdf

    1. **InputStream与OutputStream**: - **InputStream**:这是所有字节输入流的基类,提供了一套基本的方法来读取字节数据。例如,`FileInputStream`用于从文件中读取数据,而`ByteArrayInputStream`则允许从内存中...

    基于Java的实例源码-开源Winzip压缩工具Java版源码.zip

    开源Winzip压缩工具的Java版源码是Java技术在实用工具开发领域的体现,它允许开发者利用Java来实现文件的压缩与解压功能,类似于流行的Winzip软件。这个开源项目为学习和理解文件压缩算法以及Java I/O流的使用提供了...

    Java网络编程实例(随书源代码)

    - **网络I/O**:Java的InputStream和OutputStream类族在处理网络数据传输时起到关键作用,如SocketInputStream和SocketOutputStream。 - **缓冲和对象序列化**:BufferedInputStream和BufferedOutputStream用于...

    JAVA课件_chapter6-File-Stream

    ### JAVA课件_chapter6-File-Stream知识点详解 #### 一、文件与流的基本概念 ...综上所述,文件与流在Java编程中扮演着极其重要的角色,掌握了这些基础知识,能够帮助开发者更好地进行文件操作和数据传输。

Global site tag (gtag.js) - Google Analytics