`
z276356445t
  • 浏览: 150932 次
  • 性别: 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;



相关推荐

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

    FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、FileInputStream、OutputStream...

    java 编写文件上传类简单易用

    用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。本文将从文件传输的基本原理入手,分析如何用 java进行文件的上传,并提出解决方案。 一、基本...

    IO体系.java

    |--ObjectOutputStream/:将java对象的基本数据类型和图形写入到OutputStream。 | |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道...

    JavaIo流分析图

    分析Java常用IO流,包括InputStream、OutputStream、FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream、Reader、Writer、InputStreamReader、OutputStreamWriter、FileReader、...

    JAVA基础课程讲义

    常用InputStream和OutputStream子类用法 150 FileInputStream和FileOutputStream 150 ByteArrayInutStream和ByteArrayOutputStream 154 BufferedInputStream和BufferedOutputStream 156 DataInputStream和...

    java IO流读写

    InputStream和OutputStream 1.DataInputStream,DataOutputStream 从Stream里读取基本类型的数据 BufferedReader,BufferedWriter 从Reader/Writer里读取基本类型的数据 2.BufferedInputStream,...

    java自学之道

    第1章 Java基础概念 一、 Java基础语法 1、Helloworld.java 2、标识符 3、关键字 4、常量 5、变量 6、语句 6.1 if语句和switch语句 6.1.2 if语句举例 6.1.3 switch语句 6.2 for循环语句 6.3 while语句和do-while...

    JavaIO流精讲上

    File类概述、File类功能讲解、JAVA IO流概述、字节流、字符流、缓冲流、InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream、InputStreamReader、OutputStreamWriter、FileReader、...

    服务器下载文件

    OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); System.out.println("--输出流--:"+toClient); System.out.println(...

    Java之IO流学习总结

    Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...

    JDK_API_1_6

    ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化...

    java经典面试2010集锦100题(不看你后悔)

    JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...

    java IO习题

    一、选择题(前五题多选其余单选): 1. 读写原始数据,一般采用什么流?( ) A InputStream B DataInputStream C OutputStream D BufferedInputStream ...E OutputStream F BufferedOutputStream 答案:DF

    java对文件的复制和删除(文件夹、文件)

    利用java语言对文件进行复制和删除操作,并且使用了单例模式,程序可正确运行,

    IO流各个类的使用方法

    InputStream OutputStream FileInputStream FileOutputStream DataInputStream DataOutputStream BufferedInputStream BufferedOutputStream ObjectInputStream ObjectOutputStream ByteArrayInputStream ...

    批量打包下载

    BufferedOutputStream bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download");// 设置response内容的类型 response.setHeader( "Content-disposition", "attachment...

    解析jdbc处理oracle的clob字段的详解

    import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.Reader;import java.sql.Clob;...

    strust文件上传

    //将数据读入byte数组的一部分,其中读入字节数的最大值是8192,读入的字节将存储到,buffer[0]到buffer[0+8190-1]的部分中 //streamIn.read方法返回的是实际读取字节数目.如果读到末尾则返回-1.如果bytesRead返回...

    struts上传图片

    * 使用java.util.Map接口实现文件组的上传 */ private void muchUploadFile(IndexActionForm objForm) { Map, FormFile&gt; fileList = objForm.getFileList(); for(String str : fileList.keySet()) ...

Global site tag (gtag.js) - Google Analytics