`

commons-IO 包解析学习---ByteArrayOutputStream篇(3)

    博客分类:
  • Java
阅读更多

本篇是为了解析IOUtils类的准备篇

 

1.

 

    private void needNewBuffer(int newcount) {
        if (currentBufferIndex < buffers.size() - 1) {
            //Recycling old buffer
            filledBufferSum += currentBuffer.length;
            
            currentBufferIndex++;
            currentBuffer = buffers.get(currentBufferIndex);
        } else {
            //Creating new buffer
            int newBufferSize;
            if (currentBuffer == null) {
                newBufferSize = newcount;
                filledBufferSum = 0;
            } else {
                newBufferSize = Math.max(
                    currentBuffer.length << 1, 
                    newcount - filledBufferSum);
                filledBufferSum += currentBuffer.length;
            }
            
            currentBufferIndex++;
            currentBuffer = new byte[newBufferSize];
            buffers.add(currentBuffer);
        }
    }


本函数用以创建一个新的buffer byte[] 单元。

 

 

假如还没用完已存在的buffer,就继续使用已存在的old buffer

假如已经用完(或还没有创建过):

1.没创建过,创建新的以newcount为length的byte[]

2.用完,创建新的byte[],但是这一部分有点疑问。为什么要选这个大小构建新的buffer byte[]

newBufferSize = Math.max(
currentBuffer.length << 1,
newcount - filledBufferSum);

 

注意:

这个方法在ByteArrayOutputStream(int size)这个构造函数中调用的时候,是使用

synchronized块包起来的,因为要避免不同线程下同时创建新的buffer

 

 

2.

 

    public 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;
        }
        synchronized (this) {
            int newcount = count + len;
            int remaining = len;
            int inBufferPos = count - filledBufferSum;
            while (remaining > 0) {
                int part = Math.min(remaining, currentBuffer.length - inBufferPos);
                System.arraycopy(b, off + len - remaining, currentBuffer, inBufferPos, part);
                remaining -= part;
                if (remaining > 0) {
                    needNewBuffer(newcount);
                    inBufferPos = 0;
                }
            }
            count = newcount;
        }
    }


同样是用synchronized块包住写入操作部分,这里运用一个remaining判断currentbuffer是否足以装下byte[],不足就继续needNewBuffer。

 

 

3.

 

    /**
     * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
     * this class can be called after the stream has been closed without
     * generating an <tt>IOException</tt>.
     *
     * @throws IOException never (this method should not declare this exception
     * but it has to now due to backwards compatability)
     */
    @Override
    public void close() throws IOException {
        //nop
    }


特色是,无操作,因为对一个ByteArrayOutputStream进行close()操作没有任何效果,而且这样写不会产生重复关闭导致的Exception。

JDK 的 java.io.ByteArrayOutputStream里面也是这样做的

 

 

4.

 

    public static InputStream toBufferedInputStream(InputStream input)
            throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        output.write(input);
        return output.toBufferedInputStream();
    }


把一个inputstream取出返回一个新的完全内容一致的inputstream

使用情况:

 

  • 源inputstream速度很慢
  • 网络源,不能长时间保持打开
  • 有网络时间限制

 

 

 

 

总结学习过程:

1.int c = Math.min(buf.length, remaining);

这行代码在我们写东西的时候,通过对比当前操作单位大小以及总操作剩余大小,起到自动选择写入大小的作用

2.synchronized语句的作用,当对类里面可能产生线程冲突操作的部分时,严格采用synchronized语句,一个类同时只允许一个获得了syncObject的线程执行一个synchronized方法/块

 

Synchronized理解:(摘自baidu百科)

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
三、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用

 

 

分享到:
评论

相关推荐

    commons-io-1.3.2-API文档-中文版.zip

    赠送jar包:commons-io-1.3.2.jar; 赠送原API文档:commons-io-1.3.2-javadoc.jar; 赠送源代码:commons-io-1.3.2-sources.jar; 赠送Maven依赖信息文件:commons-io-1.3.2.pom; 包含翻译后的API文档:commons-io...

    commons-io-2.8.0-API文档-中英对照版.zip

    赠送jar包:commons-io-2.8.0.jar; 赠送原API文档:commons-io-2.8.0-javadoc.jar; 赠送源代码:commons-io-2.8.0-sources.jar; 赠送Maven依赖信息文件:commons-io-2.8.0.pom; 包含翻译后的API文档:commons-io...

    commons-io-2.5-API文档-中文版.zip

    赠送jar包:commons-io-2.5.jar; 赠送原API文档:commons-io-2.5-javadoc.jar; 赠送源代码:commons-io-2.5-sources.jar; 赠送Maven依赖信息文件:commons-io-2.5.pom; 包含翻译后的API文档:commons-io-2.5-...

    commons-io-2.11.0-API文档-中文版.zip

    赠送jar包:commons-io-2.11.0.jar; 赠送原API文档:commons-io-2.11.0-javadoc.jar; 赠送源代码:commons-io-2.11.0-sources.jar; 赠送Maven依赖信息文件:commons-io-2.11.0.pom; 包含翻译后的API文档:...

    commons-io-2.7-API文档-中文版.zip

    赠送jar包:commons-io-2.7.jar; 赠送原API文档:commons-io-2.7-javadoc.jar; 赠送源代码:commons-io-2.7-sources.jar; 赠送Maven依赖信息文件:commons-io-2.7.pom; 包含翻译后的API文档:commons-io-2.7-...

    开发工具 commons-io-1.3.2

    开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar最新版本

    commons-io-2.0.1大全

    Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,包含了最新的commons-io-2.0.1-bin,commons-io-2.0.1-src,commons-io-2.0.1-doc

    commons-fileupload-1.3.2jar包和commons-io-2.5jar包.zip

    commons-fileupload-1.3.2jar包和commons-io-2.5jar包,可以到http://commons.apache.org里面下载最新版本。

    commons-io-2.11.0-API文档-中英对照版.zip

    赠送jar包:commons-io-2.11.0.jar; 赠送原API文档:commons-io-2.11.0-javadoc.jar; 赠送源代码:commons-io-2.11.0-sources.jar; 赠送Maven依赖信息文件:commons-io-2.11.0.pom; 包含翻译后的API文档:...

    commons-io-2.4.jar包 官方免费版

    Eclipse、Myeclipse的输入输出-commons-io-2.4包。官方免费版

    commons-io-2.2

    commons-io-2.2 maven 依赖 jar包 commons-io-2.2maven 依赖 jar包 commons-io-2.2 commons-io-2.2

    commons-io-2.6.jar下载

    commons-io-2.6.jar下载

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    commons-io-2.2-API文档-中文版.zip

    赠送jar包:commons-io-2.2.jar; 赠送原API文档:commons-io-2.2-javadoc.jar; 赠送源代码:commons-io-2.2-sources.jar; 包含翻译后的API文档:commons-io-2.2-javadoc-API文档-中文(简体)版.zip 对应Maven...

    commons-io-2.2-API文档-中英对照版.zip

    赠送jar包:commons-io-2.2.jar 赠送原API文档:commons-io-2.2-javadoc.jar 赠送源代码:commons-io-2.2-sources.jar 包含翻译后的API文档:commons-io-2.2-javadoc-API文档-中文(简体)-英语-对照版.zip 对应...

    commons-io-2.4-API文档-中文版.zip

    赠送jar包:commons-io-2.4.jar; 赠送原API文档:commons-io-2.4-javadoc.jar; 赠送源代码:commons-io-2.4-sources.jar; 赠送Maven依赖信息文件:commons-io-2.4.pom; 包含翻译后的API文档:commons-io-2.4-...

    commons-io-2.5.jar

    commons-io-2.5 &lt;groupId&gt;org.apache.commons &lt;artifactId&gt;commons-parent &lt;version&gt;39 &lt;modelVersion&gt;4.0.0 &lt;groupId&gt;commons-io &lt;artifactId&gt;commons-io &lt;version&gt;2.5 &lt;name&gt;Apache Commons IO&lt;/name&gt;

    commons-io-1.4-API文档-中文版.zip

    赠送jar包:commons-io-1.4.jar; 赠送原API文档:commons-io-1.4-javadoc.jar; 赠送源代码:commons-io-1.4-sources.jar; 赠送Maven依赖信息文件:commons-io-1.4.pom; 包含翻译后的API文档:commons-io-1.4-...

    commons-fileupload-1.3.2.jar和commons-io-2.5.jar

    commons-fileupload-1.3.2.jar和commons-io-2.5.jar

Global site tag (gtag.js) - Google Analytics